1.取地址运算符重载
1.1const成员函数
将const修饰的成员函数称之为const成员函数,const修饰成员函数放到成员函数参数列表的后面。
const实际修饰该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改。
const 修饰Date类的Print成员函数,Print隐含的this指针由 Date* const this 变为 const Date* const this
#include<iostream>
using namespace std;
class Date
{
public:
Date(int year,int month,int day)
{
_year = year;
_month = month;
_day = day;
}
void Print()const
{
cout << _year << "/" << _month << "/" << _day<<endl;
}
private:
int _year;
int _month;
int _day;
};
int main()
{
Date d1(2004,8, 18);
d1.Print();
const Date d2(2025, 3, 12);
d2.Print();
return 0;
}
1.2 取地址运算符重载
取地址运算符重载分为普通取地址运算符重载和const取地址运算符重载.
2. 再探构造函数
(1).以前我们初始化成员变量是在成员函数的函数体中赋值,现在有另外一种方式就是初始化成员列表。
Date(int& x, int year = 1, int month = 1, int day = 1)
:_year(year)
,_month(month)
,_day(day)
(2).每个成员变量在初始化列表中只能出现⼀次。
(3).引用成员变量,const成员变量,没有默认构造的类类型变量,必须放在初始化列表位置进行初始化,否则会编译报错。
(4). C++11支持在成员变量声明的位置给缺省值,这个缺省值主要是给没有显示在初始化列表初始化的成员使用的。
(5).初始化列表中按照成员变量在类中声明顺序进行初始化,跟成员在初始化列表出现的的先后顺序无关。建议声明顺序和初始化列表顺序保持⼀致。
3.类型转换
(1). C++支持内置类型隐式类型转换为类类型对象,需要有相关内置类型为参数的构造函数。
(2). 构造函数前面加explicit就不再支持隐式类型转换。
(3).类类型的对象之间也可以隐式转换,需要相应的构造函数支持。
#include<iostream>
using namespace std;
class A
{
public:
A(int a1)
:_a1(a1)
{}
A(int a1, int a2)
:_a1(a1)
,_a2 (a2)
{}
void Print()
{
cout << _a1 << " " << _a2 << endl;
}
int Get() const
{
return _a1 + _a2;
}
private:
int _a1 = 1;
int _a2 = 1;
};
class B
{
public:
B(const A& a)
:_b(a.Get())
{}
private:
int _b = 0;
};
int main()
{
A aa1 = 1;
aa1.Print();
const A& aa2 = 1;
A aa3 = { 2,2 };
B b = aa3;
const B& rb = aa3;
return 0;
}