C++常用知识点

来源:互联网 发布:java websocket 心跳 编辑:程序博客网 时间:2024/05/02 01:35
如何让一个类不能创建实例

1虚基类,2构造函数为私有函数。

explicit的作用 

解析:explicit构造函数是用来防止隐式转换的。请看下面的代码:
class Test1
{   
public:   
Test1(int n)
{ num = n; } //普通构造函数   
private:   
int num;   
};   
class Test2   
{   
public:   
explicit Test2(int n) { num = n; } //explicit(显式)构造函数   
private:   
int num;   
};   
int main()   
{   
Test1 t1 = 12; //隐式调用其构造函数, 成功,执行了隐式转换,等价于Test1 temp(12);t1(temp);注意这个地方调用了 编译器为我们提供的默认复制构造函数    
Test2 t2 = 12; //编译错误,不能隐式调用其构造函数   
Test2 t3(12); //显示调用成功   
return 0;   
}

C++用new来创建对象和非new来创建对象的区别
#include <iostream>using namespace std;class A{private:    int n;public:    A(int m):n(m)    {    }    ~A(){}};int main(){    A a(1);  //栈中分配    A b = A(1);  //栈中分配    A* c = new A(1);  //堆中分配  delete c;    return 0;}


第一种和第二种没什么区别,一个隐式调用,一个显式调用,两者都是在进程虚拟地址空间中的栈中分配内存,而第三种使用了new,在堆中分配了内存,而栈中内存的分配和释放是由系统管理,而堆中内存的分配和释放必须由程序员手动释放,所以这就产生一个问题是把对象放在栈中还是放在堆中的问题,这个问题又和堆和栈本身的区别有关。

空类占多少个字节?

class CBase
{
};
sizeof(CBase)=1;
为什么空的什么都没有是1呢?
c++要求每个实例在内存中都有独一无二的地址。//注意这句话!!!!!!!!!!
空类也会被实例化,所以编译器会给空类隐含的添加一个字节,这样空类实例化之后就有了独一无二的地址了。所以空类的sizeof为1。

引入库

#pragma comment(lib,”*.lib”)

加入库的预编译指令,这种方法优点是可以利用条件预编译指令链接不同版本的lib文件。


原创粉丝点击