C++面向对象基础知识(一)

最近看了c++的一些课程,记录一下

构造函数

1.建议在初始化列表中完成类成员变量的赋值。
2.不带有指针的类多半不用写析构函数,我的理解是指针成员变量的使用需要开辟空间并将指针指向这部分内存,开辟的内存在堆中,这部分内存无法像开辟在栈中的内存一样自动释放,如果不重写析构函数来释放内存,会造成内存泄漏。
3.构造函数可以重载,但是遇到下面两个构造函数则无法重载。因为第一个例子有默认参数调用时可以不填参数,第二个例子没有参数调用时也可以不填写参数,所以编译器不知道调用哪个函数。

complex(double r=0,double i=0):re(r),im(i){
}
complex():re(0),im(0){}

参数传递与返回值

1.函数只读时要加const。
2.函数参数通过值传递时,会将值复制后压入栈中,通过引用传入时,相当于传指针。
3.建议如果可以,参数和返回值都用引用。
4.如果传出的变量在函数内部产生,则函数不能返回引用,因为该变量在函数结束后就释放掉了,引用该变量会报错。

操作符重载

1.<<操作符重载的实现要返回ostream&,从而cout或者cin能连续输出输入。
2.<<操作符重载过程中ostream& os不能是const,因为os一直在接受值,一直在改变。

拷贝构造,拷贝复制,析构函数

1.如果类中有指针成员变量,不要用编译器提供的拷贝构造和拷贝复制函数,会导致单纯复制指针,让多个指针指向同一个地址。我们想要的结果是再另外开辟一块内存,让新指针指向该内存,而不是像linux中的软链接一样,node指向的数据区域不是真的数据区域,最终多个链接可以改变同一块内存。
在c++中不同对象中成员变量应该存储在不同的内存中,函数只有一份,通过隐藏的this传入对象的地址,从而决定调用哪个对象的数据。所以当类中有指针成员变量时,应该重写拷贝构造和拷贝复制函数实现深拷贝,而不是调用自动生成的函数,被称为浅拷贝。
2.

// 调用拷贝构造函数
String s2(s1);
String s2=s1;
// 调用拷贝复制函数
s2=s1;

3.拷贝复制函数的实现:先把原先数据删除,再开辟同样大小的内存,再往新内存里复制值。
拷贝构造函数的实现:先开辟一块同样大小的内存,再往新内存里复制值。
4.拷贝复制函数实现的时候需要先进行判断,万一是自己赋值给自己,但是先删除了数据后面就会报错。

堆,栈与内存管理

1.栈内存出作用域会自己释放,堆内存需要手动释放。
2.静态函数和静态变量在内存中只有一份,静态函数不会有隐藏的this指针参数,所以不能调用普通的成员变量,只能调用静态成员变量。
3.c++中一般用new来分配空间,在new的底层,一般分为以下几个步骤:调用operator new来开辟内存,operator new内部则是调用malloc,返回void指针,接下来把void指针转换为相应的类型,该指针就是this指针,最后调用类的构造函数生成对象。
4.delete内部步骤:先调用析构函数释放内存,再调用operator delete释放指针,该函数内部调用free,如果类中没写析构函数,则调用默认析构函数,默认析构函数没有动作。以string类为例,string中成员变量一般是char指针,该指针指向开辟的内存空间,调用delete时,会先调用析构函数释放指针指向的内存空间,当然析构函数里要重写过要有该步骤,最后会把char指针释放掉。
5.以vc编译器为例,讲一下内存分配的情况,除了对象变量需要的内存,在调试模式下,还需要32个字节和4个字节的内存空间,这两个空间分配在变量空间的周围。除了这些还需要两个4字节的cookie,在所分配内存空间的头尾,这两个cookie记录了分配内存的大小,以16进制显示,比如如果分配了64字节的空间,则在cookie中显示为40,但实际是41,因为16进制显示的最后4位是0,取最后一位表示该空间是分配出去的还是收回的,所以显示41。
6.但最后4位一定是0吗,一定是的,因为在vc编译器中分配的内存一定是16的倍数,如果不够会通过4字节的内存块加到16的倍数。
7.在数组中,数组的分配会多四个字节表示数组的长度。
8.数组的分配要与数组的释放相对应,因为delete[]会根据数组的长度来决定调用析构函数的次数,从而释放内存。如果只用delete,则指针指向的内存不会被释放,从而造成内存泄漏。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值