返回「计算机、信息技术与工程」

C++知识点与问题

更多
Markdown 结构化数据
本文目录 12 个章节

C++知识点与问题

创建时间:2024/1/13 20:30

构造函数不能声明为虚函数

1)因为创建一个对象时需要确定对象的类型,而虚函数是在运行时确定其类型的。而在构造一个对象时,由于对象还未创建成功,编译器无法知道对象的实际类型,是类本身还是类的派生类等等 2)虚函数的调用需要虚函数表指针,而该指针存放在对象的内存空间中;若构造函数声明为虚函数,那么由于对象还未创建,还没有内存空间,更没有虚函数表地址用来调用虚函数即构造函数了

析构函数最好声明为虚函数

首先析构函数可以为虚函数,当析构一个指向派生类的基类指针时,最好将基类的析构函数声明为虚函数,否则可以存在内存泄露的问题。 如果析构函数不被声明成虚函数,则编译器实施静态绑定,在删除指向派生类的基类指针时,只会调用基类的析构函数而不调用派生类析构函数,这样就会造成派生类对象析构不完全。

函数不能返回局部变量的指针或引用的问题

原因

不要返回函数体内局部变量的地址,因为函数结束时栈会回收,局部变量也随之销毁(如果局部变量为类对象,其析构函数会被自动调用),但可以返回局部变量本身。

错误示例

string str1 = "test";
string str2 = "test";

解决方法

使用全局数组。使用全局变量时,在程序结束时才释放。

使用new/malloc在堆上动态分配内存

不要忘记了,在使用完后要进行内存的释放,不然会造成内存的泄漏。分别用delete,free(),释放。使用delete时,会调用类的析构函数,而free则不会。

string str1 = "test";
string str2 = "test";

定义为静态类型

string str1 = "test";
string str2 = "test";

用String类型

用string实现,是值拷贝!不存在释放内存会影响拷贝的问题。

string str1 = "test";
string str2 = "test";

使用字符串常量

字符串常量存储在静态存储区域,所以一直都存在

string str1 = "test";
string str2 = "test";

在调用函数中定义指针

string str1 = "test";
string str2 = "test";

Ref

https://blog.csdn.net/xuyunyunaixuexi/article/details/81989201