C++

delims 于 2020-08-14 发布
int *p = new int;  //分配1个int型的内存空间
delete p;  //释放内存

int *p = new int[10];  //分配10个int型的内存空间
delete[] p;
float d = 10.8;
void func(int n, float b=d+2.9, char c='@'){
    cout<<n<<", "<<b<<", "<<c<<endl;
}
  1. 基类的构造函数、析构函数和拷贝构造函数。
  2. 基类的重载运算符。
  3. 基类的友元函数。
	virtual int area() = 0;

= 0 告诉编译器,函数没有主体,上面的虚函数是纯虚函数

const

//保护源字符串不被修改,若修改src则编译出错。  
void fun(const char * src, char * des)
{   
	strcpy(des,src);  
}  

C++ 信号处理

信号 描述
SIGABRT 程序的异常终止,如调用 abort
SIGFPE 错误的算术运算导致,比如除以 0
SIGILL 检测到非法指令
SIGINT 程序终止(interrupt)信号
SIGSEGV 非法访问内存
SIGTERM 发送到程序的终止请求

static 关键字作用

  1. 声明静态局部变量
  2. 声明全局变量时限制作用域为本文件。
  3. 修改类成员变量时,所有对象共享。

隐式调用,声明类直接复制,等于隐式调用对应构造函数。 加上关键字 explicit 可以禁止隐式调用。

Apple apple = 10;// 隐式调用Apple(int size)

explicit Apple(int size);//禁止隐式调用

C++ 中 class 和 struct 的区别

x86_64 和 arm64的地址空间。

变长结构体。使用0长度数组。

子类构造函数

只有在没有显式声明构造函数的时候,编译器才会创建一个默认的构造函数。

子类想要初始化从父类继承的成员变量,需要调用父类的构造函数。

在子类构造函数后面加冒号然后跟上父类构造函数,就是显示调用父类构造函数。此时如果子类有和父类同名的数据成员。则会初始化子类的成员。

2022年04月17日更新

用于将把参数转成右值引用,等于强制类型转换 static_cast<T&&>(arg),这样再把返回值传给容器的时候可以调用对象的移动构造函数。移动构造函数接收一个右值引用,并将参数对象的指针成员指向的内容赋值给新对象,而不是重新生成一份,节省内存开销,主要用于临时对象的传递。

template<class A>
void G(A &&a) {
    F(std::forward<A>(a)); // 调用 F(A&& a)
    F(a); 				   // 调用 F(A& a)
}

从用户的角度来看,其含义std::forward是有条件地强制转换为右值。如果我编写的函数期望参数中包含左值或右值,并且仅当将其作为右值传递时,希望将其作为右值传递给另一个函数,则该功能很有用。如果我没有将参数包装在std :: forward中,它将始终作为常规引用传递。