C++学习笔记(五) 从C到C++
2016-01-26 11:26
337 查看
主要内容:
内联函数
内联函数与带参数宏区别
新的类型转换运算符
一、内联函数
二、内联函数与带参数宏的区别
1.内联函数调用时,要求实参和形参的类型一致
内联函数会先对实参表达式进行求值,然后传递给形参
而宏调用时只用实参简单地替换形参
2.内联函数是在编译的时候、在调用的地方将代码展开的
而宏则是在预处理时进行替换的
注:在C++中建议采用inline函数来替换带参数的宏。
三、新的类型转换符
旧式转型
(T)expr
T(expr)
新式转型
const_cast<T>(expr)
static_cast<T>(expr)
reinterpret_cast<T>(expr)
dynamic_cast<T>(expr)
1.const_cast
用来移除对象的常量性
const_cast一般用于指针或者引用
使用const_cast去除const限定的目的不是为了修改它的内容,通常是为了函数能够接受这个实际参数
2.static_const
编译器隐式执行的任何类型转换都可以由static_cast完成
当一个较大的算术类型赋值给较小的类型时,可以用static_cast进行强制转换。
无法将const转化为nonconst,这个只有const_cast才可以办得到
3.reinterpret_cast(不知有何用处)
“通常为操作数的位模式提供较低层的重新解释”也就是说将数据以二进制存在形式的重新解释。
int i;
char *p = "This is a example.";
i = reinterpret_cast<int>(p);
//此时结果,i与p的值是完全相同的。
int *ip
char *pc = reinterpret_cast<char*>(ip);
// 程序员需要记得pc所指向的真实对象是int型,并非字符串。
// 如果将pc当作字符指针进行操作,可能会造成运行时错误
// 如int len = strlen(pc);
4.dynamic_cast
执行“安全向下”转型操作,也就是说支持运行时识别指针或所指向的对象,这是唯一个无法用旧式语来进行的转型操作。
四、尽量避免强制类型转换
尽可能避免使用强制转换
如果无法避,推荐使用新式类型转换
内联函数
内联函数与带参数宏区别
新的类型转换运算符
一、内联函数
inline int max(int a, int b) { return a > b ? a : b; }
二、内联函数与带参数宏的区别
1.内联函数调用时,要求实参和形参的类型一致
内联函数会先对实参表达式进行求值,然后传递给形参
而宏调用时只用实参简单地替换形参
2.内联函数是在编译的时候、在调用的地方将代码展开的
而宏则是在预处理时进行替换的
注:在C++中建议采用inline函数来替换带参数的宏。
三、新的类型转换符
旧式转型
(T)expr
T(expr)
新式转型
const_cast<T>(expr)
static_cast<T>(expr)
reinterpret_cast<T>(expr)
dynamic_cast<T>(expr)
1.const_cast
用来移除对象的常量性
const_cast一般用于指针或者引用
使用const_cast去除const限定的目的不是为了修改它的内容,通常是为了函数能够接受这个实际参数
void fun(int &val); const int val = 100; fun(const_cast<int&>(val));注:const_cast去除const限定后并不能改变常量的值
2.static_const
编译器隐式执行的任何类型转换都可以由static_cast完成
当一个较大的算术类型赋值给较小的类型时,可以用static_cast进行强制转换。
double val = 3.14; int val2 = static_cast<int>(val);可以将void*指针转换为某一类型的指针
int val = 3.14; void* val3 = &val; int* val4 = static_cast<int*>(val3);可以将基类指针指向派生类指针
无法将const转化为nonconst,这个只有const_cast才可以办得到
3.reinterpret_cast(不知有何用处)
“通常为操作数的位模式提供较低层的重新解释”也就是说将数据以二进制存在形式的重新解释。
int i;
char *p = "This is a example.";
i = reinterpret_cast<int>(p);
//此时结果,i与p的值是完全相同的。
int *ip
char *pc = reinterpret_cast<char*>(ip);
// 程序员需要记得pc所指向的真实对象是int型,并非字符串。
// 如果将pc当作字符指针进行操作,可能会造成运行时错误
// 如int len = strlen(pc);
4.dynamic_cast
执行“安全向下”转型操作,也就是说支持运行时识别指针或所指向的对象,这是唯一个无法用旧式语来进行的转型操作。
四、尽量避免强制类型转换
尽可能避免使用强制转换
如果无法避,推荐使用新式类型转换
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- c#入门之类型转换详解
- C++联合体转换成C#结构的实现方法
- C#难点逐个击破(9):类型转换
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例