类和对象
隐含的this指针
1. 每个成员函数都有一个指针形参,即this指针。(构造函数没有隐含的this指针形参)。
2. 编译器会对成员函数进行处理。对象调用时,对象地址作实参传递给成员函数的第一个形参 this 指针。
3. this 指针是成员函数 隐含的指针形参编译器处理的,我们不能随意添加,也不能在调用时显示的传递对象的地址 给this指针。
构造函数
对私有的成员变量进行初始化。构造函数仅在定义对象的时候自动执行一次。
构造函数是特殊的成员函数;
特点:
函数名与类名同名;
无返回值;
对象构造时,即对象实例化,系统自动调用构造函数;
构造函数可以重载;
可以在类内外定义;
如果类中没有给出构造函数,编译器会自动给出一个缺省的构造函数;
无参构造函数 全缺省值的构造函数 都是全省构造函数,只能有一个。
拷贝构造函数
创建对象时使用同类对象来进行初始化,即 同类对象的引用;
特点:
构造函数的重载;
必须使用引用传参,传值会引起无穷递归调用 。(如果不是传引用,则就相当于传值方式,而传值则会调用该类的拷贝构造函数,从而无穷递归的调用拷贝构造函数。* 传指针也是传值的方式。)
如果没有显示定义,系统会默认缺省的拷贝构造函数,缺省的会一次拷贝类成员来初始化。
ps:创建对象的同时初始化 是拷贝构造函数。
为什么可以直接访问私有的成员变量?
1.在类的成员函数中可以直接访问同类对象的私有、保护成员;
2.C++的访问限定符是以类为单位的,即 在这个单位内的成员是可以互相访问的。
析构函数
一个对象的生命周期结束,系统会自动调用析构函数。
析构函数是特殊的成员函数。
特点:
类名前 加~
无返回值
一个类只有一个析构函数,如果没有,系统会自动生成缺省的析构函数。
析构函数不是删除对象 而是做些清理工作。
运算符重载
增强程序的可读性,C++支持运算符的重载。
特点:
operator+ 合法的运算符构成函数名(重载< operator<)
重载以后,不能改变运算符的优先级、结合性、操作数个数。
5个不能重载的运算符:
. 类成员访问运算符
.* 类成员指针访问运算符
:: 作用域
sizeof 长度运算符
?: 三目运算符 条件运算符。
赋值运算符的重载
赋值运算符是对一个已存在的对象进行拷贝赋值。
拷贝构造函数是创建对象的同时用已有的对象初始化它。
#include<iostream>
using namespace std;
class Date
{
public:
Date()//默认构造函数
{}
Date(int year, int month, int day) //构造函数
:_year(year)
,_month(month)
,_day(day)
{
cout << "构造" << endl;
}
~Date()
{}
Date(const Date& d) //拷贝构造
{
_year = d._year;
_month = d._month;
_day = d._day;
cout << "copy"<<endl;
}
Date& operator=(const Date& d) //赋值运算符的重载
{
if (this != &d)
{
_year = d._year;
_month = d._month;
_day = d._day;
}
cout << "==" << endl;
return *this;
}
void print()
{
cout << _year << " " << _month << " " << _day << endl;
}
private:
int _year;
int _month;
int _day;
};
int main()
{
Date d1(2015,6,4);
Date d2 = d1;
Date d3;
d3 = d1;
d1.print();
d2.print();
d3.print();
getchar();
return 0;
}
哪些成员变量必须放在初始化列表里面?
1.常量成员变量(常量 创建时必须初始化)
2.引用类成员变量(引用创建时必须初始化)
3.没有缺省构造函数的类成员变量。
成员变量按声明顺序依次初始化,而不是初始化列表出现的顺序。