C/C++基础点
文章平均质量分 63
鸟恋旧林XD
无限风光在险峰
展开
-
C/C++面试题的知识点(1)
c/c++面试中常见的知识点整理。原创 2017-07-20 09:42:15 · 440 阅读 · 0 评论 -
static和const关键字的作用(3)
static关键字(1)函数体内的static变量,作用范围为该函数体,内存只被分配一次,其值在下次调用时仍然是上次的值。(2)模块内的static全局变量,可被模块内所有函数访问,但不能被模块外的函数访问。(3)模块内的static函数,可被模块内的其他函数调用,适用范围限定在声明它的模块内。(4)类中的static成员变量, 属于类所有,对类的所有对象只有一份拷贝。(5)类中的static成员函原创 2017-07-20 15:38:07 · 527 阅读 · 0 评论 -
引用和指针
(1)引用必须初始化。指针可以为空。(2)引用初始化后不可改变,就是指向某个变量(内存)。指针可以改变,指向不同区域。(3)引用的大小是对象的大小。指针的大小是本身大小,一般是4字节。(4)引用和指针的++自增运算符意义不同。int a(8), b(9); int &ar = a; cout << ar << endl; //8 ar = b; cout << ar << endl; //9 co原创 2017-07-26 22:21:54 · 305 阅读 · 0 评论 -
struct结构体的大小
默认情况下,每个成员相对于结构体变量地址的偏移量正好是该成员类型所占字节的整数倍;且最终占用字节数为成员类型中最大占用字节数的整数倍。 struct A { int a; char b; short c; };A的大小为4+1+1(填充)+2=8 a的偏移量为0,占据4个字节。b的偏移量为4,占据1个字节。c的偏移量为6,占据2个字节。struct B { char原创 2017-07-26 21:36:56 · 1227 阅读 · 1 评论 -
C++定义一个只能在堆上(栈上)生成对象的类
如何定义一个只能在堆上(栈上)生成对象的类? 1.C++中类的对象如何建立?(1)静态建立class A{ ... };A a;静态建立一个类的对象,编译器为该对象在栈中分配内存,通过直接移动栈顶指针,挪出适当空间;然后调用类的构造函数形成一个栈上的对象。注意:直接调用类的构造函数。当销毁对象时,调用类的析构函数。(2)动态建立动态建立类对象,使用new运算符将对象简历在堆空间中。class原创 2017-07-26 21:07:36 · 1605 阅读 · 0 评论 -
循环引用和解决方案
如何处理循环引用问题? 什么是循环引用?顾名思义,两个对象之间形成环路。对于C++中两个对象来讲,使用智能指针解决不了这个问题。因为其引用计数不为0。循环引用解决办法循环引用涉及的问题是垃圾回收(Garbage Collection,GC)。垃圾就是不再被引用的对象。讨论基本的垃圾回收算法。详见:GC基本算法讨论原创 2017-07-26 17:16:06 · 6550 阅读 · 0 评论 -
动态内存与智能指针
1.为什么会有智能指针?因为存在下面的一些尴尬情况:(1)申请动态内存时,new完忘了写delete。如果程序规模比较大,则很难检查出这个错误。导致内存泄露,程序发生莫名其妙的问题。(2)我们定义a指针指向某对象,然后定义b也指向该对象。此时只是指针的拷贝,对象数据只有一份。当我们通过b释放了该对象时,a指针就变成悬空指针。其危险性和未初始化的指针一样。(3)避免悬空指针的一个办法是在复制时采用深度原创 2017-07-26 16:39:05 · 262 阅读 · 0 评论 -
STL中vector/map/set实现原理
(1)vector是顺序容器,本质是一个动态数组,支持随机存取、插入、删除、查找等操作。内存中占用一段连续空间。初始会分配一段内存空间。当元素超出范围时,vector会重新开辟空间,由stl中的allocator分配,新空间大小是原先的2倍,然后将旧数据移动到新空间中,释放旧空间。一旦空间重新分配,指向原vector的所哟迭代器就会失效。(2)map是关联容器,以键值对(key-value)的形式进原创 2017-07-25 22:47:02 · 525 阅读 · 0 评论 -
null 和 nullptr
引入nullptr的原因引入nullptr的原因,这个要从NULL说起。C和C++中的NULL不等价。NULL表示指针不指向任何对象,但是问题在于,NULL不是关键字,而只是一个宏定义(macro)。NULL在C中的定义 在C中,习惯将NULL定义为void*指针值0:#define NULL (void*)0 C++中,NULL却被明确定义为整常数0:// lmcons.h中定义NULL的源码原创 2017-08-16 16:52:41 · 878 阅读 · 0 评论 -
C/C++面试题的知识点(5)
1、利用union巧判机器CPU的大小端机器大小端的话题,有点难受。定义就那么一说,看你怎么理解这个大小了。其实对使用者没什么关系,一个int变量在内存中的布局是看不见的。 对一个数:0x1234其高位值为12,低位值为34。 内存地址从低到高排列。假设该数存在0x4000-0x4001。 小端模式存法为:高位值存高地址,低位值存低地址: 内存地址 存放内容 0x4000 0x3原创 2017-07-20 16:35:50 · 537 阅读 · 0 评论 -
C/C++面试题的知识点(13)
(1) 一个对象访问普通成员函数和虚函数哪个更快? 答:访问普通成员函数较快。原因是普通成员函数的地址,在编译阶段已经确定,访问时直接寻址;而虚函数在调用时,首先需要找到虚函数表指针,然后在虚函数表中寻找虚函数地址,这个过程花费时间导致访问比普通函数速度慢一些。(2) 在什么情况下,析构函数需要是虚函数? 当我们delete一个动态分配的对象的指针时,将执行析构函数。如果该指针指向继承体系中原创 2017-07-31 21:40:50 · 351 阅读 · 0 评论 -
C++多态,虚函数作用及底层实现原理
简述C++虚函数作用及底层实现原理 1.forewordC++是面向对象程序设计,其包括3项特点: (1)数据抽象:接口和实现分离 (2)继承:父类和子类 (3)多态:动态绑定本文讨论多态。当父类希望子类重新定义某些函数时,用virtual关键字声明为虚函数。当我们使用一个基类类型的引用或者指针,调用一个虚函数时就引发动态绑定/多态的发生。函数运行版本由传入的实参类型决定。可以用父类型的指针指原创 2017-07-31 21:18:04 · 3697 阅读 · 5 评论 -
类的const成员函数(4)
参看《c++primer》P231内容,之前有点云里雾里,反复看不甚清晰。写了个实际例子方才搞清,记下。定义一个类A:class A { public: A() = default; A(int tmp) : num(tmp) {} ~A() = default; void print() { cout << a; } private: int num = 0原创 2017-07-20 16:08:31 · 309 阅读 · 0 评论 -
编写类String的构造函数、析构函数和赋值函数(2)
编写类String的构造函数、析构函数和赋值函数。重载输出运算符。class String { public: String(const char *str = NULL); // 普通构造函数 String(const String &other); // 拷贝构造函数 ~ String(void); // 析构函数 String & opera原创 2017-07-20 12:32:44 · 592 阅读 · 0 评论 -
C++中4种类型转换相关的关键字
c风格的转换的格式很简单:(Type)Expressionc风格类型转换有不少缺点,有时用c风格的转换是不合适的,因为它可以在任意类型之间转换。比如你可以把一个指向const对象的指针转换成指向非const对象的指针,把一个指向基类对象的指针转换成指向一个派生类对象的指针,这两种转换之间的差别是巨大的,但是传统的c语言风格的类型转换没有区分这些。还有一个缺点是c风格的转换不容易查找,由一个括号加上一原创 2017-08-04 12:01:08 · 496 阅读 · 0 评论