类的默认成员函数,构造函数,拷贝构造,析构函数,赋值运算符重载
2018-01-26 15:53
483 查看
1.隐含的this指针
1.每个成员函数都有一个指针形参,她的名字是固定的,成为this指针,this指针是隐式的。(构造函数比较特殊,没有这个隐含的 this指针)
2.编译器会对成员函数进行处理,在对象调用成员函数时,对象地址作为实参传递给成员函数的第一个形参this指针
3.this指针是成员函数隐含指针形参,是编译器自己处理的。我们不能在成员函数的形参中添加this指针的参数定义,也不能在调用 时显示传递对象的地址给this指针
2.类的默认成员函数
一 构造函数
日期的成员变量是私有的,我们怎么来初始化这些私有的成员变量?
成员变量是私有的,要对他进行初始话,必须要用一个公有成员函数来进行,同时这个函数仅在定义对象时自动执行一次,这时调用的函数称为构造函数,构造函数是特殊的成员函数。
特征如下:
1.函数名与类名相同
2.无返回值
3.对象构造(对象实例化)时系统自动调用对应的构造函数
4.构造函数可以重载
5.构造函数可以在类中定义,也可以在类外定义
6.如果类定义中没有给出构造函数,则编译器自动产生一个缺省的构造函数,但只要我们定义了一个构造函数,系统就 不会自动生成缺省的构造函数
7.无参构造函数和全缺省的构造函数都认为是缺省的构造函数,并且缺省的构造函数只能有一个
二 拷贝构造函数
创建对象时使用同类对象来进行初始化,这时所用的构造函数称为拷贝构造函数,拷贝构造函数是特殊的构造函数
特征如下:1.拷贝构造函数其实是一个构造函数的重载
2.拷贝构造函数的参数必须使用引用传参,使用传值方式会引发无穷递归调用(为什么)
原因:如果不传引用,那d1给d2进行传参数,先建一个临时对象,把参数传进去然后进行一系列赋值等,即实参是 形参临时拷贝即用的d1拷贝d,又要调用拷贝构造,依次下去无穷尽也。
3.若未显示定义,系统会默认缺省的拷贝构造函数,会依次拷贝类的数据成员完成初始化
三 析构函数
析构函数:与构造函数功能相反,在对象销毁时,由编译器自动调用,完成类的一些资源清理和汕尾工作
特征:1.析构函类名(构造函数名)加上字符~
2.析构函数无参数,无返回值
3.一个类有且只有一个析构函数,若未显示定义,系统会自动生成缺省的析构函数
4.在对象生命周期结束时,编译系统会自动调用析构函数
5.析构函数体内并不是删除对象(对象是在main函数中,对象的销毁是main函数栈帧干的事,而是做一些清理工 作)
四:赋值运算符重载
什莫是运算符重载呢?
为了增强程序的可读性,c++支持运算符重载
运算符重载的特征:
1.operator 合法的运算符 ,构成函数名
2.重载运算符以后,不能改变运算符的优先级/结合性/操作数个数
笔试题:五个c++不能重载的运算符 .* :: sizeof ?:(三目运算符) .(成员访问符)
底下附上原代码:
#include<iostream>
using namespace std;
class Date
{
public:Date(int year = 0, int month = 0, int day = 0)//构造
{
_year = year;
_day = day;
_month = month;
}
Date(const Date& d)//拷贝构造
{
cout << "拷贝构造" << endl;
_year = d._year;
_month = d._month;
_day = d._day;
}
Date& operator= (const Date& d)//如果返回值不用引用,返回临时变量,就要调一次拷贝构造函数
{ //如果参数不用引用,也要调用拷贝构造函数
if (this != &d)
{
_year = d._year;
_month = d._month;
_day = d._day;
}
return *this;
}
void Print()
{
cout << _year << " " << _month << " " << _day << endl;
}
private:
int _year;
int _month;
int _day;
};
int main()
{
Date d2(2017, 5, 6);
d2.Print();
Date d4;
d4 = d2;
d4.Print();
system("pause");
return 0;
}
1.每个成员函数都有一个指针形参,她的名字是固定的,成为this指针,this指针是隐式的。(构造函数比较特殊,没有这个隐含的 this指针)
2.编译器会对成员函数进行处理,在对象调用成员函数时,对象地址作为实参传递给成员函数的第一个形参this指针
3.this指针是成员函数隐含指针形参,是编译器自己处理的。我们不能在成员函数的形参中添加this指针的参数定义,也不能在调用 时显示传递对象的地址给this指针
2.类的默认成员函数
一 构造函数
日期的成员变量是私有的,我们怎么来初始化这些私有的成员变量?
成员变量是私有的,要对他进行初始话,必须要用一个公有成员函数来进行,同时这个函数仅在定义对象时自动执行一次,这时调用的函数称为构造函数,构造函数是特殊的成员函数。
特征如下:
1.函数名与类名相同
2.无返回值
3.对象构造(对象实例化)时系统自动调用对应的构造函数
4.构造函数可以重载
5.构造函数可以在类中定义,也可以在类外定义
6.如果类定义中没有给出构造函数,则编译器自动产生一个缺省的构造函数,但只要我们定义了一个构造函数,系统就 不会自动生成缺省的构造函数
7.无参构造函数和全缺省的构造函数都认为是缺省的构造函数,并且缺省的构造函数只能有一个
二 拷贝构造函数
创建对象时使用同类对象来进行初始化,这时所用的构造函数称为拷贝构造函数,拷贝构造函数是特殊的构造函数
特征如下:1.拷贝构造函数其实是一个构造函数的重载
2.拷贝构造函数的参数必须使用引用传参,使用传值方式会引发无穷递归调用(为什么)
原因:如果不传引用,那d1给d2进行传参数,先建一个临时对象,把参数传进去然后进行一系列赋值等,即实参是 形参临时拷贝即用的d1拷贝d,又要调用拷贝构造,依次下去无穷尽也。
3.若未显示定义,系统会默认缺省的拷贝构造函数,会依次拷贝类的数据成员完成初始化
三 析构函数
析构函数:与构造函数功能相反,在对象销毁时,由编译器自动调用,完成类的一些资源清理和汕尾工作
特征:1.析构函类名(构造函数名)加上字符~
2.析构函数无参数,无返回值
3.一个类有且只有一个析构函数,若未显示定义,系统会自动生成缺省的析构函数
4.在对象生命周期结束时,编译系统会自动调用析构函数
5.析构函数体内并不是删除对象(对象是在main函数中,对象的销毁是main函数栈帧干的事,而是做一些清理工 作)
四:赋值运算符重载
什莫是运算符重载呢?
为了增强程序的可读性,c++支持运算符重载
运算符重载的特征:
1.operator 合法的运算符 ,构成函数名
2.重载运算符以后,不能改变运算符的优先级/结合性/操作数个数
笔试题:五个c++不能重载的运算符 .* :: sizeof ?:(三目运算符) .(成员访问符)
底下附上原代码:
#include<iostream>
using namespace std;
class Date
{
public:Date(int year = 0, int month = 0, int day = 0)//构造
{
_year = year;
_day = day;
_month = month;
}
Date(const Date& d)//拷贝构造
{
cout << "拷贝构造" << endl;
_year = d._year;
_month = d._month;
_day = d._day;
}
Date& operator= (const Date& d)//如果返回值不用引用,返回临时变量,就要调一次拷贝构造函数
{ //如果参数不用引用,也要调用拷贝构造函数
if (this != &d)
{
_year = d._year;
_month = d._month;
_day = d._day;
}
return *this;
}
void Print()
{
cout << _year << " " << _month << " " << _day << endl;
}
private:
int _year;
int _month;
int _day;
};
int main()
{
Date d2(2017, 5, 6);
d2.Print();
Date d4;
d4 = d2;
d4.Print();
system("pause");
return 0;
}
相关文章推荐
- 拷贝构造,深度拷贝,关于delete和default相关的操作,explicit,类赋初值,构造函数和析构函数,成员函数和内联函数,关于内存存储,默认参数,静态函数和普通函数,const函数,友元
- 号)、sex(性别)、birthday(出生日期)、id(身份证号)等等。其中“出生日期”定义为一个“日期”类内嵌子对象。用成员函数实现对人员信息的录入和显示。要求包括:构造函数和析构函数、拷贝构造函
- virtual与构造/析构函数(内联函数,构造函数,静态成员函数不能为virtual函数)
- C++对拷贝构造及默认成员函数的优化处理
- 【C/C++学院】0819-/类的成员函数与const-mutable /构造与析构/拷贝构造deletedefault以及深浅拷贝/静态成员函数成员变量类在内存的存储默认参数/友元类以及友元函数
- 拷贝构造函数,深拷贝,大约delete和default相关业务,explicit,给定初始类,构造函数和析构函数,成员函数和内联函数,关于记忆储存,默认参数,静态功能和正常功能,const功能,朋友
- 深度解析-->c++中构造函数,拷贝构造,赋值运算符重载,析构函数的调用情况
- 定义圆类Circle,数据成员有半径radius,成员函数有默认构造函数(默认半径为10)、构造函数、计算圆面积、圆周长以及输出函数,分别构造默认对象和半径为15的对象,输出各对象的周长与面积。
- 定义长方体类,数据成员有长、宽、高,成员函数有带默认形参值的构造函数(默认长宽高分别为2.5、3.4、2)、计算体积函数,分别构造默认对象和长宽高分别为6.25、4.8、5.2的对象,输出各对象的体积
- C++类四个默认函数---构造函数、析构函数、拷贝函数、赋值函数
- 第十四节 构造方法、静态成员、静态构造函数、析构函数和构造重载
- ASP 类成员变量、成员函数、构造析构函数
- 成员函数中调用构造析构函数
- 十、构造函数和析构函数(四) 拷贝构造函数、默认拷贝构造函数、拷贝构造函数调用几种情况、深拷贝浅拷贝、构造函数和=操作符区别、禁止对象拷贝
- 深入了解构造函数,析构函数,拷贝构造,赋值函数的原理
- C++类四个默认函数---构造函数、析构函数、拷贝函数、赋值函数
- 构造函数,析构函数,虚函数,内联函数,静态成员函数,重载,覆盖,隐藏
- 1.const成员函数 2.内联函数 3.友元 4.static成员 5.N中构造拷贝构造的优化
- C++类中的4个特殊函数 - 缺省构造函数、拷贝构造函数、拷贝赋值操作符和析构函数
- 类的构造函数、析构函数、成员函数与赋值函数