- new与delete的功能
问题:为了让某个类只能通过new来创建(即如果直接创建对象,编译器将报错),应该()
A. 将构造函数设为私有
B. 将析构函数设为私有
C. 将构造函数和析构函数均设为私有
D. 没有办法能做到
new一个对象时,本质是:
- 申请一块空间给这个对象
- 调用该对象的构造函数去初始化这块空间
显然若将构造函数设为私有则无法通过new来创建对象。
delete一个对象的本质是:
- 调用该对象的析构函数
- 回收分配给该对象的空间
那么将析构函数设为私有,有办法回收new出来的空间吗?
我们可以这样设计代码
class A {
public:
void DeleteA() {
A::~A();
}
private:
int _a;
~A() {
cout << "delete A success!" << endl;
}
};
int main() {
A* pa = new A;
pa->DeleteA();
return 0;
}
这样一个只通过new来创建的对象就可以被正常回收了。
- C++不能被重载的运算符
- .运算符
- .*运算符
- ::运算符
- 单目运算符,如:?:
- sizeof
- 空类的字节数
类的字节数取决于类中的非静态成员变量,且遵从内存对齐的原则。那如果一个类是空类,它的字节数不是0,而是1。
原因如下:
- 当有多个空类的指针时,如果字节数为0,则每个指针分不清它们各自指向的对象。
- 所以在一些主流编译器中,就将空类的大小优化为1。
4.C++被const修饰的变量
下方代码的输出结果:
#include <iostream>
using namespace std;
int main(void)
{
const int a = 10;
int * p = (int *)(&a);
*p = 20;
cout<<"a = "<<a<<", *p = "<<*p<<endl;
return 0;
}
首先这段代码没有问题,&a的类型是const int类型,再强转成int类型,所以p就可以修改a中的值。但输出结果是:
a = 10, *p = 20
原因如下:
编译器在编译代码时,在看到对常量中内容进行读取时,会直接使用常量中的内容替换该常量。可以理解为编译器先将a = 10作为常量给记住了,下次读取a中的数据时,无论是否通过什么方式对a中的数据进行了修改,读取到a的数据仍为10。