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

Posted 赏一杯茶:

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每日一练---- 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。

以上是关于每日一练---- 3.02 3.03 3.04oj总结(类知识点)的主要内容,如果未能解决你的问题,请参考以下文章

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

每日一练----1.18 oj总结

每日一练----1.18 oj总结

每日一练----1.22 oj总结

每日一练----1.22 oj总结

每日一练----1.22 oj总结