c++杂记
2016-03-19 21:15
274 查看
1.接口和抽象类的区别
接口是对动作的抽象;抽象类是对根源的抽象。抽象类表示这个对象是什么;接口表示的是,这个对象能做真么。
一个类一般只能继承一个抽象类;但是可以实现多个接口。
2.sizeof
class A { }; class B { public: B(){} }; class C { public: virtual void fun(){}; }; class D { public: virtual void fun() = 0; };
sizeof(A) = 1 :因为我们声明类类型的实例的时候,必须在内存中占有一定的空间,否则无法使用这些实例。
sizeof(B) = 1 :因为调用构造函数与析构函数只用知道函数地址即可。
sizeof(C) = 4 :虚函数需要一个指向虚表的指针,而一个指针在32位机器上是4字节,在64为机器上是8字节。
sizeof(D) = 4 :同上
3.main函数执行以前及以后,分别还会执行什么。
1)执行之前:设置栈指针
初始化static静态与全局变量,即data段的内容
将未初始化的全局变量,static变量赋值:数值型赋值为0,bool赋值为false,指针为NULL,即bss段的内容
将main函数的参数,argc, argv传递给main函数。
2)执行之后:
全局对象的析构函数
在main函数中用ateixt()注册的终止处理程序。
4.malloc与new的区别
1)new是c++中的操作符;malloc是c中的一个函数2)new不只会分配内存,而且会调用类的构造函数,同理delete会调用类的析构函数;而malloc则只是分配内存,不会进行初始化类成员的工作,同样free也不会调用析构函数。
3)不要用malloc/free来完成动态对象的内存管理,因为他们并没有调用构造/析构函数。
4)如果用free释放new 出来的对象,这个对象有可能因为无法执行析构函数而导致程序出错。如果用delete释放malloc申请的动态内存,原则上是不会错的,但是容易引起误会。
一篇实现malloc的文章
new与malloc的区别,以及内存分配浅析
new的注意一点:
int *ia = new int; //ia所指向的数值是未知的 int *ib = new int(); //ib所指向的数值是0
5.c++ 线程安全的单例模式
#include <thread> #include <mutex> class Lock { private: std::mutex *cs; //临界资源 public: Lock(std::mutex *mt):cs(mt) { cs->lock(); } ~Lock() { cs->unlock(); } }; class single { private: static single *pSingle; static std::mutex cs; //临界资源 class Garbo { public: ~Garbo() { if(single::pSingle) delete single::pSingle; } }; static Garbo garbo; public: static single *Instance() }; single *single::pSingle = nullptr; single * single::Instance() { if(pSingle == nullptr) { Lock lock(&cs); //这里声明了一个Lock类型的局部变量,这样 //在退出他的作用域之后就可以调用他的析构 //函数来对cs进行unlock; if(pSingle == nullptr) { pSingle = new single(); return pSingle; } } return pSingle; }
6.static变量
static变量分为静态的全局变量与静态的局部变量。他们之间的区别在静态的全局变量是一个全局的变量,可以被其他函数访问。而静态的局部变量只是一个局部变量,不能被其他函数访问。
第二:静态全局变量是在main函数之前被初始化的。而静态的局部变量是在执行到这个函数时才被初始化。
但是他们都存储在bss段或者data段。
常量存储区
char *str1 = "ABCD"; char *str2 = "ABCD"; /* 这里str1 == str2,因为ABCD存储在常量存储区,str1与str2都指向这一块区域。 */
7.delete 与 delete[]
delete与delete[]的区别相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C与C++之间相互调用实例方法讲解
- 解析C++中派生的概念以及派生类成员的访问属性