asp net网站开发语言的特点,网站搭建排名优化,网站关键词优化怎么弄,北京建站优化公司文章目录 前言一、this指针1.1、this指针的引出1.2、 this指针的特性 二、类的默认的六个构造函数2.1、构造函数简述2.2构造函数 三、析构函数3.1、析构函数引出3.2、特点#xff1a; 四、拷贝构造4.1、引入4.2、特征#xff1a;4.3、默认拷贝构造函数 总结 前言
在本节中 四、拷贝构造4.1、引入4.2、特征4.3、默认拷贝构造函数 总结 前言
在本节中我将给大家介绍我们在学习C中经常要用到的this指针、类的六个默认成员函数、运算符重载等相关知识. 下面我会结合一个简单的类----日期类来介绍 后面需要时会补充相应的成员函数
class Date
{
public:void Display()//打印类对象中的内容{cout _year - _month - _day endl;}void SetDate(int year, int month, int day){_year year;_month month;_day day;}
private:int _year; // 年int _month; // 月int _day; // 日
};一、this指针
1.1、this指针的引出
int main(){Date d1, d2;d1.SetDate(2024,5,1);d2.SetDate(2024,6,1);d1.Display();d2.Display();return 0;}当执行上述代码时它的输出结果为 下面的汇编不了解的可以搜一下栈帧的创建和销毁对今后的学习帮助很大 通过汇编我们可以看到两次调用的SetDat函数地址相同调用同一函数 对于上述类有这样的一个问题 Date类中有SetDate与Display两个成员函数函数体中没有关于不同对象的区分那当d1调用SetDate函数时该函数是如何知道应该设置s1对象而不是设置d2对象呢
C中通过引入this指针解决该问题即C编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数让该指针指向当前对象(函数运行时调用该函数的对象)在函数体中所有成员变量的操作都是通过该指针去访问。只不过所有的操作对用户是透明的即用户不需要来传递编译器自动完成。
1.2、 this指针的特性 this指针只能在“成员函数”的内部使用this指针本质上其实是一个成员函数的形参是对象调用成员函数时将对象地址作为实参传递给this形参。this指针是成员函数第一个隐含的指针形参不需要用户 传递. 将调用成员函数展开
下面我们来证明一下this指针本质上就是对象的地址 为了更清晰的展示我会简化用不到的代码 class Date
{
public:void Print_this(){cout this endl;//打印this指针}
private:int _year; // 年int _month; // 月int _day; // 日
};
int main()
{Date d1, d2;d1.Print_this();//cout d1 endl;//如果和我们说的一样那么打印结果应该两两相同d2.Print_this();cout d2 endl;return 0;
}
结果 可以看到this本质就是对象的地址。这就是隐藏的this指针当然我们可以像学习C语言时知道一个结构体对象的地址使用“-”来进行成员变量的访问
class Date{public:void Display(){cout this- _year - this- _month - this-_day endl;}private:int _year; // 年int _month; // 月int _day; // 日};二、类的默认的六个构造函数 恩师莫怪 2.1、构造函数简述
如果一个类中什么成员都没有简称为空类。空类中什么都没有吗并不是的任何一个类在我们不写的情况下编译器都会自动生成6个默认成员函数。这些函数叫做构造函数。构造函数的任务是初始化类对象的数据成员无论何时只要类的对象被创建就会执行构造函数。 构造函数特点: 1.构造函数的名字和类名相同。 2.和其他函数不一样的是构造函数没有返回类型。 3.类似于其他的函数构造函数也有一个(可能为空的)参数列表和一个(可能为空的)函数体。 4.构造函数不能被声明成const 的。 需要特别注意的是一个类可以拥有多个参数不同的构造函数这些构造函数之间向普通函数之间一样可以构成函数重载
2.2构造函数 再贴一遍方便大家看 class Date
{
public:void Display()//打印类对象中的内容{cout _year - _month - _day endl;}void SetDate(int year, int month, int day){_year year;_month month;_day day;}
private:int _year; // 年int _month; // 月int _day; // 日
};对于Date类可以通过SetDate公有的方法给对象设置内容但是如果每次创建对象都调用该方法设置信息未免有点麻烦那能否在对象创建时就将信息设置进去呢我们上面说过创建类的类型对象时由编译器自动调构造函数保证每个数据成员都有 一个合适的初始值并且在对象的生命周期内只调用一次。
class Date
{
public:// 1.无参构造函数Date(){}// 2.带参构造函数Date(int year, int month, int day)//无返回值{_year year;_month month;_day day;}
private:int _year;int _month;int _day;
};
void TestDate()
{Date d1; // 调用无参构造函数Date d2(2024, 6, 1); // 调用带参的构造函数用于初始化// 注意如果通过无参构造函数创建对象时对象后面不用跟括号否则就成了函数声明// 以下代码的函数声明了d3函数该函数无参返回一个日期类型的对象Date d3(); 如果类中没有显式定义构造函数则C编译器会自动生成一个无参的默认构造函数一旦用户显式定义编译器将不再生成。 1.证明编译器默认生成的为无参的构造函数: 可以看到我将自己写的构造函数屏蔽后调用有参的构造函数是无法成功的无参的并没有报错这也说明编译器默认生成的为无参的构造函数。 2.证明当我们显示写出一个构造函数编译器就不会在生成默认的构造函数
我将带参的构造函数显示定义d1无法调用无参的默认构造函数。 无参的构造函数和全缺省的构造函数都称为默认构造函数并且这两个默认构造函数不能同时存在。注意无参构造函数、全缺省构造函数、我们没写编译器默认生成的构造函数都可以认为是默认成员函数. 默认构造函数我们一般是为了处理自定义类型的成员变量 三、析构函数
3.1、析构函数引出
前面通过构造函数的学习我们知道一个对象时怎么来的那一个对象又是怎么没呢的 析构函数与构造函数功能相反析构函数不是完成对象的销毁局部对象销毁工作是由编译器完成的。而对象在销毁时会自动调用析构函数完成类的一些资源清理工作(比如类中定义的指针指向的空间的清理)
3.2、特点
析构函数名是在类名前加上字符 ’~‘。无参数无返回值。一个类有且只有一个析构函数。若未显式定义系统会自动生成默认的析构函数。对象生命周期结束时C编译系统系统自动调用析构函数
![class Date
{
public:~Date(){_year 0;_month 0;_day 0;} Date(int year, int month, int day){_year year;_month month;_day day;}int _year;int _month;int _day;
};
int main()
{Date d2(2024, 6, 1);return 0;
}
反汇编视角:
在上面的代码中我并没有去显示调用析构函数但是在程序执行结束时编译器自动调用了析构函数。 这个也可以像构造函数一样测试大家尝试一下
四、拷贝构造
4.1、引入
拷贝构造函数是构造函数的一种重载形式它可以用来创建一个与已存在的对象一模一样的新对象。对于拷贝构造它只有单个形参且该形参必须是对本类类型对象的引用因为要引用所以要加const修饰。
4.2、特征 1.拷贝构造函数的参数若使用传值方式编译器直接报错 因为会引发无穷递归调用。 2.若未显式定义编译器会生成默认的拷贝构造函数。 默认的拷贝构造函数,对对象按 字节序完成拷贝这种拷贝叫做浅拷贝或者值拷贝。 3.编译器生成的默认拷贝构造函数已经可以完成字节序的值拷贝了。 class Date
{
public:Date(int year 1900, int month 1, int day 1)//全缺省{_year year;_month month;_day day;}// Date(const Date d) // 错误--引发无穷递归Date(const Date d) // 正确写法_year d._year;_month d._month;_day d._day;}
private:int _year;int _month;int _day;
};
int main()
{Date d1;Date d2(d1);//也可以写成Date d2d1return 0;
}4.3、默认拷贝构造函数
像上面介绍的默认成员函数一样当我们没有在类中写拷贝构造函数时编译器会自动生成一个默认的拷贝构造。
系统生成的拷贝构造也会针对成员变量的内置类型和自定义类型做一个区分。对于内置类型的成员变量编译器会按照被拷贝对象的内存存储字节序完成拷贝就好比被拷贝的对象有3个int类型成员变量占12字节内存编译器会根据该对象的内存和成员初始值拷贝给新对象。
总结
本次我们介绍了this指针、构造函数、析构函数、拷贝构造、等一些与类紧密关联的知识。 要将他们详细的介绍所用篇幅过长后续会出拓展版的