【每日一练】---- 3.02 3.03 3.04oj总结(类知识点)

  1. new与delete的功能
    问题:为了让某个类只能通过new来创建(即如果直接创建对象,编译器将报错),应该()
    A. 将构造函数设为私有
    B. 将析构函数设为私有
    C. 将构造函数和析构函数均设为私有
    D. 没有办法能做到

new一个对象时,本质是:

  1. 申请一块空间给这个对象
  2. 调用该对象的构造函数去初始化这块空间

显然若将构造函数设为私有则无法通过new来创建对象。


delete一个对象的本质是:

  1. 调用该对象的析构函数
  2. 回收分配给该对象的空间

那么将析构函数设为私有,有办法回收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来创建的对象就可以被正常回收了。


  1. C++不能被重载的运算符
  1. .运算符
  2. .*运算符
  3. ::运算符
  4. 单目运算符,如:?:
  5. sizeof
  1. 空类的字节数
    类的字节数取决于类中的非静态成员变量,且遵从内存对齐的原则。那如果一个类是空类,它的字节数不是0,而是1。
    原因如下:
  1. 当有多个空类的指针时,如果字节数为0,则每个指针分不清它们各自指向的对象。
  2. 所以在一些主流编译器中,就将空类的大小优化为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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值