初始化列表
冒号:开头 逗号,分隔 大括号{}结尾,初始化列表中的值优先于缺省值,且初始化的顺序和列表无关,顺序基于private中声明的顺序,如果初始化顺序错误可能会导致得到随机值。
必须在初始化列表初始化的类型有const型变量,重载类型变量和自定义变量
例如:
Test* operator&()//取地址重载 { return this; } private: const int x; int& _ref;
x和_ref必须在初始化列表中初始化
class Test
{
public:
//tip:加上explicit = 不允许隐式转换
Test()//初始化列表 冒号: 开头 逗号,分隔 大括号{}结尾
:_a1(20)//有初始化列表中的值后就用列表中的 不用缺省
,_a2(30)
,x(1)
,_ref(_a1)
//tip:初始化顺序和列表无关 和声明顺序有关
// 如果初始化顺序错误,会得到随机值
{
_a1++;
_a2--;
cout << "Test()初始化列表" << endl;
}
void Print() const//const修饰 *this
{
cout << _a1 << endl;
}
Test* operator&()//取地址重载
{
return this;
}
const Test* operator&() const//取地址const重载
{
return this;
}
private:
//必须在初始化列表写的 _ref x 自定义类型
int _a1=10;//缺省
int _a2;
const int x;
int& _ref;
};
int test7()//初始化列表
{
const Test a;
a.Print();//是一个权限展开 要用const修饰 *this
cout << &a <<endl;
//Test a=1;//单参数构造函数支持隐式转换 多参数构造函数不支持
//Test a={1,2,3}; //多参数构造函数C++11后支持
return 0;
}
静态成员和匿名对象
1、静态成员函数没有this指针 和静态成员类型搭配使用
2、静态成员不属于某个对象 属于所有对象 属于整个类
3、声明时不能缺省初始化或在初始化列表中初始化,必须全局初始化
匿名对象:指没有被实例化的类,如:类名为Test,那么它的匿名对象就是Test();它的生命周期只有使用的那一行,结束即删除。
class T8
{
public:
T8()
{
cout << "T8()" << endl;
++count;
}
T8(const T8& a)
{
++count;
}
static int GetCount()//静态成员函数没有this指针 和静态成员类型搭配使用
{
//_a++;//不能访问非静态成员
return count;
}
~T8()
{
cout << "~T8()" <<endl;
}
private:
//不属于某个对象 属于所有对象 属于整个类
static int count; //声明 不能缺省初始化或在初始化列表中初始化
int _a=1;
};
int T8::count=0;//全局初始化
int test8()
{
T8 aa;
cout << T8::GetCount() << endl;
T8();//匿名对象 生命周期只在这一行
return 0;
}