第六第七章 初始化与清除和重载与默认参数 Thinking in C++ V1
构造函数:与类的名字相同,但没有返回值。在创建对象时,由编译器自动的调用。编译器会在对象的定义处插入构造函数的调用行,编译器会隐含的向构造函数传递一个参数,即 本对象的内存地址。
析构函数:析构函数与类的名字相同但在前面添加 ~ ,析构函数没有参数表(有参数表也没意义),且析构函数由编译器自动调用。析构函数自动调用的唯一根据是包含这个对象的 右括号。(析构函数的调用顺序和构造函数的调用顺序相反。)
局部跳转(goto)会可能触发析构函数(只要goto跳出了对象的作用域)。非局部跳转不会触发析构,例如:setjmp()和longjmp。构造函数与析构函数均为public成员,因为析构函数与构造函数均由系统自动调用,而调用的方式是在对象定义处与包含对象的右括号处由编译器自动插入调用析构与构造函数的调用语句。此时这两个函数相当于在对象的外部执行,其必须为public。
C++中对象的定义和初始化是集为一体的:
对象的创建和初始化必须同时完成,否则无法通过编译。一般编译器会检查是否在条件语句中定义了对象。因为在条件语句中的对象可能没有被初始化:
例如:if(***)static X x; if语句很可能因为假而被跳过,故对象x只是被分配了内存,但没有被初始化,此系统会报错或警告。
默认构造函数:当类中没有显式的定义构造函数,系统会生成一个默认的构造函数,但这个默认构造函数不会对对象中的数据做明确的初始化。
重载:相同的名字但不同的参数表。不能使用返回值实现重载,因为很多时候我们使用了一个函数但忽略它的返回值。一般而言编译器内部实现重载的方法是使用参数列表来标识每一个函数,例如一个函数int print(float flt)在编译器内部可能表示为_print_float()。
union:
同一片内存空间,当选择联合中不同的成员时,会对这片内存做不同的解释。
匿名联合:没有名字的联合,例如
union{
float f;
double d;
int i;
};
在使用这种联合时,不需要联合的名字就可以使用其中的变量,例如直接对i赋值:i=9; 可以用作浮点数的相等比较
占位符参数:
声明:void f(int x , int = 0 , float flt = 1);//默认参数只能存在于函数声明中。
定义:void f(int x , int , float flt ){}
函数的声明中 int fun(); 在C++与C中的含义是不同的,C中意味着函数的参数是任意的,类型任意,参数也任意。但在C++中表示没有参数。
引用的定义:int &n ,引用可以认为是指针的语法糖。
static在不同范围的两种意思(这些规则对对象而言一样适用):
一、全局 内部连接
二、函数内部 这类变量会保存在静态存储区,而且这类变量只会被初始化一次。
const与volatile:
C++中与C中的const意义不同。在C中会为const变量分配内存空间,在C++中不一定会这样。
在C++中const变量可能并不存在内存中,因为在编译过程中编译器可能直接将其优化而消失。
volitile 与const相反,volatile通知编译器不要优化某个变量。
位运算符 & | ~ ^(异或) << >>
注意:所有的位运算都是在寄存器中执行的并没有在变量的内存空间有所体现。那么为了对某个变量进行位操作,必须进行赋值操作。例如 i = i>>2 ;
所有的二元运算符都可以和等号相结合 如: a += 3 ; b>>=2; ~是一元运算符,不能与等号结合。
逗号运算符:逗号运算符是所有运算符中优先级最低的。
int main()
{
int a1 , a2 , b=2 , c=3 , d=4;
a1 = (b++,c++,d++);
a2 = b++ , c++ , d++;//赋值运算符 ' = ' 的优先级高于逗号故先赋值
}
逗号运算符用于分隔表达式,而逗号运算表达式的值是最后一个表达式的值。
上面a1的值为4整个表达式的值是最后一个即d++ 。 a2的值为2 ,等号的优先级要高于逗号运算符。
C++中的显式转换:
static_cast:用于非多态类型的转换。
dynamic_cast:用于多态类型的转换。
const_cast:用来消除const, volatile, __unaligned属性的转换。
reinterpret_cast:用于空间的重新解释。
具体见:http://blog.csdn.net/callmeback/article/details/4040583
与C不同,C++中结构体的名字可以直接用来定义新的变量。
例如:定义struct S{};
在C中定义变量时需要使用:struct S VS;
在C++中可以直接使用: S VS ;
关键字this产生本结构体的地址。
java中不允许局部变量与全局变量同名,但C++可以。

浙公网安备 33010602011771号