C++杂记

1.拷贝构造函数为什么需要传引用?
传值本身就用到了拷贝构造函数,如果用传值代替传引用,直接陷入递归死循环。

2.string类原理
basic_string是一个模版类,string是模版形参为char的basci_string模版类的类型定义,即typedef

typedef basic_string<char, char_traits<char>, allocator<char>> string;

而npos,是初始化为-1表示没有找到:

static const size_type npos = -1;

basic_string是类模版,并且是容器类模版,basic_string类模版的对象管理的序列是标准的C++ 字符串,basic_string包括string、wstring、u16string和u32string,分别对应char、wchar_t(宽字符)、char16_t(16位char)、char32_t(32位)。

3.浅拷贝和深拷贝
在有指针的情况下,浅拷贝只是增加了一个指针指向已经存在的内存,而深拷贝就是增加一个指针并且申请一个新的内存,使这个增加的指针指向这个新的内存,采用深拷贝的情况下,新对象完全独立于被拷贝的对象。

4.右值引用、lvalue、xvalue、prvalue
https://blog.csdn.net/qq_40586164/article/details/107690601

5.编译相关
https://blog.csdn.net/qq_40586164/article/details/107621976

6.new

int *p1=new int;//默认初始化,*p1值未定义
int *p2=new int();//值初始化,*p2值为0

C++new的底层实现有两步:

  1. 调用一个合适的operator new函数分配足够的内存,默认使用malloc分配,分配失败会抛出异常
    (可以强制不抛出异常:new (std::nothrow) xxx() );
  2. 调用合适的构造函数初始化这块内存。

当我们重载operator new的时候,重载的是第一步里operator new的内存分配方式,而不是整个new表达式。

7.绝不重新定义继承而来的缺省参数
虚函数中如果存在默认参数值,在派生类中覆盖这个虚函数时改变默认参数值会失效。就算改变了默认参数值,使用的还是基类虚函数的默认参数值。
因为 虚函数是动态绑定的,但是为了执行效率,缺省参数是静态绑定的。使用的是指针类型对应虚函数的参数。
https://blog.csdn.net/sinat_35261315/article/details/53767750?tdsourcetag=s_pcqq_aiomsg

8.定义和声明
定义是一种特殊的声明,它创建了一个对象;
声明简单地说明了在其他地方创建的对象的名字,它允许你使用这个名字。
声明相当于普通的声明:它所说明的并非自身,而是描述其他地方的创建的对象。
定义相当于特殊的声明:它为对象分配内存。

9.数组名和指针的区别
编译器用数组名标记数组的属性,比如具有确定数量的元素。

只有当数组名在表达式中使用时,编译器才会为它产生一个指针常量。而只有以下两种情况,才不被当做指针常量:

  • sizeof(数组名):返回数组长度(所占的字节数,不是数组元素个数),而不是指向数组的指针的长度。
  • &数组名:产生一个指向数组的指针,而不是一个指向某个指针常量的指针。

10.const

A. const char *pContent;
B. char  *const pContent;
C. char const *pContent;//同A
D. const char* const pContent; 

沿着 * 号划一条线,
如果const位于 * 的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;(底层const)
如果const位于 * 的右侧,const就是修饰指针本身,即指针本身是常量。 (顶层const)
https://www.cnblogs.com/vcfly/archive/2008/12/27/1363562.html
任何对象都可以是顶层const,但如果一个常量对象被其他对象(指针、引用等复合类型)所指向,那这个对象就成为了底层const。

11.运算符重载有类内重载和类外重载(声明为类的友元)两种,但类内重载需要强制类对象位于运算符左边,所以可能出现 Point< 因此一般把输出运算符重载放在类外。

12.volatile关键字
volatile意为易变的、不稳定的,和const一样,是类型限定符。
用它声明的类型变量表示可能被某些编译器未知的因素更改,比如:操作系统,硬件或者其他线程等。
因此编译器不会对该变量的代码进行优化,总是从其所在的内存直接读取数据,以防止变量值被外部事件修改后,未能及时更新。

你可能感兴趣的:(c++)