c++备忘02

0x00 计算、表达式

    左值与右值:赋值号左边为左值,指一个变量,右边为右值,指常量值或者变量的值

    常量:有三种常量:①字面常量 ②constexpr 定义的编译时已知的常量 ③const定义的初始化后不变的常量(编译时可以未知)

    函数声明与定义可以分离,这样对于互相引用的函数才能通过编译,如:

void f();
void f1();
void f2();
void f(){
    f2();
}
void f2(){
    f1();
}

    vector的几种初始化形式:

vector<int> v(5);//5个int,都初始化为0
vector<int> v{1,2,3,4,5};//5个int 12345
vector<int> v={1,2,3,4,5};

0x01 错误

    分为:

    编译时错误:语法或者类型错误

    链接时错误

    运行错误:硬件、操作系统错误 库错误 用户代码抛出的错误

    逻辑错误

    异常机制:c++将错误检测和错误处理分离,在被调用函数中检测错误,调用者处理错误,这样的原因是,被调用函数并不知道调用者的意图,因此无法处理错误,而调用者检测错误容易遗漏。throw try catch

    

0x02 函数细节

    函数的声明和定义分别用于:

    声明:描述如何使用一个接口

    定义:该接口的具体实现

    声明使得程序的每个部分又能有程序其他部分的一个视图,而不必关心具体的实现

    可声明:变量 常量 函数 类型 名字空间 模板

    声明一个变量时,使用{}给其初始化,(除了声明vector个数时用())

    默认初始化:如果不显式初始化,则会执行默认初始化,c++不允许我们设置内置类型的默认初始化,全局变量默认初始为0,(编译器会将局部变量也初始为0),自定义类型应该提供默认构造函数。

    作用域:声明在哪儿起作用

    全局作用域 名字空间作用域 类作用域 局部作用域(两个大括号{}之间)

    向函数传递参数和函数返回值,有两种方式:

    传值:c++默认方式,将传入的值拷贝一份,给函数

    传引用:使用int& a,表示接受一个引用,因此编译器将传入变量的引用,在函数内部直接读写该变量,加一个const int& a,表示只能读

    区别:传值要复制,开销大,且在函数内部无法操作传入的变量,而只是副本。

    同样也可以返回一个函数内部的变量的引用,但是注意该变量的作用域仅在函数内部,执行到函数结束会被销毁,因此该引用非法,可以加个static,这样出了函数也能用。

    需要传递常量引用的地方,可以直接传常量字面量,此时编译器会创建一个临时变量,赋值为该常量,然后传入该变量的引用。如下:

void f(const int& p){
    cout<<p<<'\n';
}
int main(){
    f(2);//int temp=2;f(temp)
}

    调用栈:c++也是靠栈实现函数的调用,每个函数的栈帧保存了传入参数,局部变量。

    变量初始化顺序:当执行线程到达一个变量定义时,就会为其分配空间,执行初始化。全局变量在main的第一条语句执行前就初始化,知道程序结束被销毁,而函数里的局部变量会在该函数被调用时初始化,然后退出函数时被销毁,{}也是一样。而静态局部变量,则只会在首次被执行到时才初始化,并且知道程序结束才销毁。

    名字空间:用于区分同名类型,可以用using namespace xxx;表示使用不同的名字空间,也可以在类目前一直带着 xxx::A