//引用成员变量/const成员变量/没有默认构造的成员变量,必须写在初始化列表中/不写但有缺省值
//不满足:会报错
class Date
{
public:
Date(int& x, int year = 1, int month = 1, int day = 1)
:_year(year)
,_month(month)
,_day(day)
,_t(12)
,_ref(x)
,_n(1)
{
// error C2512: "Time": 没有合适的默认构造函数可⽤
// error C2530 : "Date::_ref" : 必须初始化引⽤
// error C2789 : "Date::_n" : 必须初始化常量限定类型的对象
}
void Print() const
{
cout << _year << "-" << _month << "-" << _day << endl;
}
private:
int _year;
int _month;
int _day;
Time _t; // 没有默认构造
int& _ref; // 引⽤
const int _n; // const
};
cpp复制代码
class Date
{
public:
private:
// 注意这⾥不是初始化,这⾥给的是缺省值,这个缺省值是给初始化列表的
// 如果初始化列表没有显⽰初始化,默认就会⽤这个缺省值初始化
int _year = 1;
int _month = 1;
int _day;
Time _t = 1;
const int _n = 1;
int* _ptr = (int*)malloc(12);
};
来个小题目:
cpp复制代码
#include<iostream>
using namespace std;
class A
{
public:
A(int a) // a = 1
:_a1(a) // 再用a初始化_a1,_a1 = 1
, _a2(_a1) // 先用_a1初始化_a2,但是此时_a1还没有初始化,是个随机值
{}
void Print()
{
cout << _a1 << " " << _a2 << endl;
}
private:
int _a2 = 2; //先初始化_a2
int _a1 = 2; //再初始化_a1
};
int main()
{
A aa(1);
aa.Print();
}
class A
{
private:
static int _k;
int _h = 1;
public:
class B // B默认就是A的友元
{
public:
void foo(const A& a)
{
cout << _k << endl; //OK
cout << a._h << endl; //OK
}
int _b1;
};
};
int A::_k = 1;
6、匿名对象
匿名对象的使用方法:类型(实参)
之前有名对象的使用方法:类型 对象(实参)
匿名对象和拷贝时创建的临时对象的定位是未命名对象,他们的生命周期都只是在当前一行。
适用场景:一般临时定义一个对象在当前一行使用,就可以用匿名对象。
cpp复制代码
class Solution
{
public:
int Sum_Solution(int n)
{
//...
return n;
}
};
int main()
{
// 不能这么定义对象,因为编译器⽆法识别下⾯是⼀个函数声明,还是对象定义
//A aa1();
// 但是我们可以这么定义匿名对象,匿名对象的特点不⽤取名字,
// 但是他的⽣命周期只有这⼀⾏,我们可以看到下⼀⾏他就会⾃动调⽤析构函数
A();
A(1);
A aa2(2);
// 匿名对象在这样场景下就很好⽤,当然还有⼀些其他使⽤场景,这个我们以后遇到了再说
Solution().Sum_Solution(10);
return 0;
}