huangfu Blog
Love Leanote!
Toggle navigation
huangfu Blog
主页
About Me
归档
标签
03类型转换运算符/类和对象
2017-02-06 19:59:38
69
0
0
tarena
#C++中的类型转换运算符 **1. 静态转换** 在某一个方向上可以做自动类型转换(隐式类型转换) `int * -------> void * // 可以转换` `int * -------> int // 编译器报错` > static_cast<类型>(变量) 例子代码 #include <iostream> using namespace std; void getData(void* pv) { int *p = static_cast<int*>(pv); cout << *p << endl; } int main() { int x = 159; getData(&x); } **2. 动态类型转换** 具有多态性的父子类之间 > dynamic_cast<类型>(变量) `在后面学到` **3. 去常类型转换** 专门用来去除const修饰的 > const_cast<类型>(变量) 例子代码 #include <iostream> using nameapcae std; int main() { const int i =100; int a = const_cast<int>(i); } **扩展** > const修饰的全局变量存储在内存的只读存储区,局部变量存储在栈区 >const局部变量只是告诉编译器不能通过const修饰的变量名显示的改变它(也就是受编译器保护,但操作系统不会保护它,即可以骗过编译器隐式的修改它) > 常说的const表示常量是对编译器来说的 #includea<iostream> using namespace std; int main() { const int i = 100; /* volatile可以防止编译器优化*/ //volatile const int i = 100; int *p = (int *)&i; *p = 200; /* 用gcc编译结果为200*/ cout << i << endl; // 100编译器优化 cout << *p << endl; // 200 cout << p << endl; // 0x7ffc0a87366c cout << &i << endl; // 0x7ffc0a87366c } **4. (强制)类型转换** 适用于各种指针之间的转换,最接近于强制类型转换 > reinterpret_cast<类型>(变量) 例子代码 #include <iostream> using namespace std; int main() { int x = 0x12345678; int *p = reinterpret_cast<int *>(x); cout << p << endl; // 0x12345678 } #来自于C++社区的建议 * 尽量少使用宏 使用const替代一个常量 使用enum去替代多个常量 使用inline替代带参宏 * 使用namespace避免命名冲突 * 使用泛型和模板去刻画一组逻辑或类型 * 变量随时用随时定义 以保证它的初始化 * 尽量少用malloc free 因为new delete会做的更好 * 少用 char * 和 char数组来代表字符串 使用string类型替代 * 逐步建立面向对象的思想 # 什么是面向对象? **1. 一切皆对象** 一切都可以以对象的形式来描述 **2. 程序就是由一组对象组成的** 对象通过发消息 通知相互做什么 `Date date; date.show();` **3. 一个对象是由其他对象组成的** **4. 一个对象都有一个对应的类型** **5. 同类型的对象 可以接收相同的消息** #分类 现实世界 ---> 抽象 ---> 计算机 #如何分类 抽取核心特征和核心行为: 汽车特征: string cno; string color; double price; double speed; 汽车核心行为: void show(); void start(); void run(); void stop(); #实现分类的方式 **1. 使用结构体** 特征 ---- 成员变量 行为 ---- 成员函数 #include <iostream> #include <string> using namespace std; struct Car { /* 特征*/ string cno; string color; double price; double speed; /* 行为*/ void show() { cout << "车牌:" << cno << "颜色:" << color << "价格:" << price << "最高速度:" << speed << "Km/h" << endl; } void start() { // ... } void run(double s) { cout << "以速度" << s << "Km/h 运行" << endl; } void stop() { // ... } }; int main() { Car car = {"京A.9520", "红色", 245892.2, 300}; car.show(); car.start(); car.run(100.21); car.stop(); } 扩展: #include <iomanip> /* 显示时间格式控制*/ cout << setfill('0') << setw(2) << hour << ':' <<setw(2) << min << ':' << setw(2) << sec << '\r' << flush; // setfill('0') 表示用0填充 // setw(2) 表示宽度为2 // flush表示刷新缓冲区 **2. 使用类** 关键字由struct 变成了 class struc中默认的权限是公开的 *(public)* class中默认的权限是私有的 *(private)* C++中引入了关键字public\private\protected用来修饰成员权限 > public权限的成员 可以在类内 或 类外都可以使用 > private权限只能在类内使用 > protected权限的数据在类内 或 子类中使用 例子代码 #include <iostream> #include <string> using namespace std; class Car { /* 特征*/ public: string cno; string color; double price; double speed; /* 行为*/ void show() { cout << "车牌:" << cno << "颜色:" << color << "价格:" << price << "最高速度:" << speed << "Km/h" << endl; } void start() { // ... } void run(double s) { cout << "以速度" << s << "Km/h 运行" << endl; } void stop() { // ... } }; int main() { Car car = {"京A.9520", "红色", 245892.2, 300}; car.show(); car.start(); car.run(100.21); car.stop(); }
上一篇:
02函数重载/哑元/参数默认值/内联/动态分配内存/引用
下一篇:
04构造函数\初始化列表\类头文件于源文件分离
0
赞
69 人读过
新浪微博
微信
腾讯微博
QQ空间
人人网
提交评论
立即登录
, 发表评论.
没有帐号?
立即注册
0
条评论
More...
文档导航
没有帐号? 立即注册