初入C++

C++第一课


命名空间

  • 为了防止在同一个工程或文件中两个相同变量的命名冲突
  • 一个命名空间就是一个作用域

命名空间的属性

  • 命名空间里面可以放
    1. 变量
    2. 函数
    3. 命名空间(q嵌套)

命名空间的使用

  • [空间名]::[空间内容](只是一次使用某个空间的内容)
  • using namespace [空间名] (默认使用某个空间)
  • using [空间名] :: [空间内容](默认使用此空间的此变量)

简单输入输出

  • c++的输入输出标准头文件为 #include
  • 输出:cout<<[要输出的对象]<< endl;
    • cout代表console out
    • 此句话的意思为将要输出的对象送到console out
  • 输入:cin>>[接收的空间];

    • cin代表console in
    • 此句话代表将console in 送到接收的空间中
    • 接收空间就是变量
  • cin 和 cout 会自动识别类型,不用手动格式化

缺省参数

全缺省参数

函数中所有的而参数都有缺省值,例如

int Add(int a = 10; int b = 20)
{
    return a + b;
}

如果调用的时候只是传入了部分参数(相对与此函数的话传入了一个参数,或者没有传参,只是调用),结果如下:

Add(1);//此结果为a为1, b 为20, 返回值为21;
Add(1,2);//此结果为a为1,b为2,返回值为3;
Add();//此结果为a为10,b为20,返回值为30;

半缺省参数

函数中并不是所有的参数都有缺省值,例如:

int Add(int a, int b, int c=2)
{
    return a + b + c;
}

半缺省参数的参数后面不能有无缺省的参数

Add(1,2);//此结果为a为1,b为2,c为缺省参数2,返回值为5;
Add(1);//此结果为报错
Add(1,2,3);//此结果为a为1,b为2,c为3,返回值为6

无缺省的参数在调用时必须传参
缺省参数不能只使用中间缺省参数的缺省值。
C/C++函数的调用约定为传参是从右向左传的。
缺省值可以为常量、全局变量或者宏定义的符号。

函数重载

函数名相同,参数不同(数量或者类型或者不同类型参数的位置不同)的函数;
重载函数的返回值可以不同(仅仅返回者不同的函数不能构成重载的)
重载函数的功能可以不同

函数重载的存在条件

作用域相同(全局,命名空间)
参数列表不同
函数名必须相同
例如:

int Add(int a, int b){ return a + b; }
double Add(double a, double b){ return a + b; }

尽量避免与缺省函数的重载

为什么C语言不支持函数重载?

编译器在链接时是通过寻找函数名来调用函数的。

扫描二维码关注公众号,回复: 2623949 查看本文章

因为c语言在编译的时候编译器(VS)只是给函数名前面加上下划线(不管参数列表相不相同),所以相同函数名加上下划线后还是一样的,所以编译器无法确定调用哪个。

在c++里面,编译的时候,编译器会给参数列表不同函数名相同的函数后面加上区别的标志,参数列表不同标志不同,所以链接的时候就可以区分重载的函数了。

总结:C语言和C++随函数的函数名修饰规则不同,导致C语言不能像C++那样支持函数重载。那么C++就不能使用C语言编译的库了,但是可以使用 extern "C" + 函数声明 来使用C编译的库。

引用

引用的概念

引用就是给一个变量起一个别名,此别名并不会再次开辟空间,而是和它引用的实体公用同一块空间

引用的声明

int a = 10;
int& ra = a;//普通引用
const int b= 20;
const int& rb = b;//常引用
const int& rx = 10;//常引用

引用的属性

  1. 引用的变量和引用的地址是相同的,引用在声明的时候必须初始化。
  2. 一个引用只能和一个实体结合,并且不能再次改变
  3. 具有常属性的实体只能和常引用结合,常引用的不能改变的
  4. 引用的声明周期小于等于实体的声明周期。

        如果声明的引用和实体的类型不一样,那么将会创建一个空间将这个实体按照引用的类型把数据拿出来(有可能截断)放入这个空间,因为此空间创建之后,用户不能知道此空间的名字,或者地址,所以此空间具有常属性,所以此引用应该用常引用的类型。例如:

double a = 12.1;
const int&ra = a;
//a和ra的地址不一样

通过传引用来改变实参

void Swap(int& a, int& b)
{
     int tmp = a;
     a = b;
     b = tmp;
}
int main()
{
    int a = 10;
    int b = 20;
    Swap(a, b)
}
//结果是将a和b的值进行了交换

思考为什么引用可以将两个值进行交换?

  • 其实在底层,引用是通过编译器转化为指针的,即处理方式一模一样,所以在底层还是给引用申请了空间。
  • 引用就相当于这样的指针:

    int a = 10;
    int* const ra = &a;
    

    但在代码层面使用引用并不用进行解引用,所以可以认为引用就是上述指针的封装。

  • 因为const类型的变量在声明时必须初始化,所以引用在初始化的时候也必须初始化。

引用和指针的不同点

  1. 引用声明时必须初始化
  2. 指针可以为NULL,引用不能为NULL
  3. 引用在引用一个实体之后就不能在引用其他实体,但是指针可以。
  4. sizeof指针 代表指针的大小, sizeof引用 代表实体的大小。
  5. 引用自加1代表给实体加1,指针加1代表向后移动一个类型。
  6. 右多级指针,没有多级引用
  7. 访问实体方式不同(用户层面),指针需要解引用,引用不用解引用。
  8. 引用比指针更加安全

C++全局属性

C++中的const关键字
    在C语言中#define定义的常量符号在C++中完全可以用const修饰的变量来替换,因为Const修饰的变量在使用的时候,编译器在预处理的时候就已经将const修饰的变量已经进行的替换尽管你用指针去修改此便俩个的值,但是此变量在预处理的时候就已经替换了

C++中的 inline关键字

  1. inline关键字修饰的函数叫做内联函数,其作用给是告诉编译器,在执行到调用此函数的时候,再将此函数展开。
  2. inline只是给编译器的一个建议,但是编译器还是先判断此函数是否符合优化的条件
  3. 如果代码很长或者含有循环,递归,编译器将会忽略inline关键字的修饰。
  4. inline修饰的函数可以用来替换宏函数,并且没有宏的副作用。

猜你喜欢

转载自blog.csdn.net/qq_38590948/article/details/81158037
今日推荐