• c++的概述(二)


    新增bool类型

    bool的变量只能赋值为true (非0) 或false (0)

    1. #include
    2. using namespace std;
    3. int main(int argc, char const *argv[])
    4. {
    5. bool num;
    6. num = true;
    7. cout<<"true = "<<true<
    8. cout<<"false = "<<false<
    9. return 0;
    10. }

     

    三目运算符功能增强

    C语言的3目运算符 a>b ? a:b

    a>b ? a:b返回的是a或b的值。

    1 (a>b ? a:b) = 100;//错误

    C++语言的3目运算符 a>b ? a:b

    a>b ? a:b返回的是a或b的引用(a或b的变量名)

    1 (a>b ? a:b) =100;//ok

    c++引用

    引用的本质:给已有的变量名 取个别名

    1、引用的定义方式:

    //给num取个别名为b

     int num =100;

     //&不是取b的地址 只是描述b是num的别名 编译器不会为b开辟新的空间

     int &b = num;  //num的别名 是b

     //操作b等价操作num

    1. #include
    2. using namespace std;
    3. int main(int argc, char const *argv[])
    4. {
    5. int num = 10;
    6. int &b = num;
    7. cout<<"num = "<
    8. cout<<"b = "<
    9. //b和num 占用同一块空间
    10. cout<<"&num = "<<&num<
    11. cout<<"&b = "<<&b<
    12. return 0;
    13. }

     定义步骤:

    1、&修饰别名

    2、给哪个变量取别名 就定义哪个变量

    3、从上往下 整体替换

    案例1:给数组取别名

    1 int arr[5] ={1,2,3,4,5};

    2 int (&new_arr)[5] = arr;

     

    1. #include
    2. using namespace std;
    3. void tets()
    4. {
    5. int arr[5] = {1,2,3,4,5};
    6. int (&new_arr)[5] = arr;
    7. cout<<sizeof(new_arr)<
    8. cout<2]<
    9. }
    10. int main(int argc, char const *argv[])
    11. {
    12. tets();
    13. return 0;
    14. }

     2、引用必须初始化

    int &b;  //非法的

     3、引用一旦确定是谁的别名 就不能更改

    int num = 10;

    int &b = num;

    int data = 20;

    b=data;  //千万不要认为是b给data取别名 仅仅是将data的值赋值b也就是data赋值num

     4、引用作为函数的参数 可以替代指针变量

    1. #include
    2. using namespace std;
    3. void swap_int01(int a1, int b1)
    4. {
    5. int tmp = a1;
    6. a1 = b1;
    7. b1 = tmp;
    8. }
    9. void swap_int02(int *a1, int *b1)//a1=&a, b1=&b
    10. {
    11. //*a1 == a, *b1 == b
    12. int tmp = *a1;
    13. *a1 = *b1;
    14. *b1 = tmp;
    15. }
    16. void swap_int03(int &a1, int &b1)//int &a1 = a, int &b1=b
    17. {
    18. //a1 == a, b1 == b
    19. int tmp = a1;
    20. a1 = b1;
    21. b1 = tmp;
    22. }
    23. void test07()
    24. {
    25. int a = 10;
    26. int b = 20;
    27. cout<<"a = "<", b = "<
    28. //swap_int01(a, b);//交换 不成功
    29. //swap_int02(&a, &b);//交换 成功
    30. swap_int03(a, b);//交换 成功
    31. cout<<"a = "<", b = "<
    32. }
    33. int main(int argc, char *argv[])
    34. {
    35. test07();
    36. return 0;
    37. }

     引用作为函数的参数的好处:

    1、函数内部 直接通过引用操作外部变量的值

    2、省去了指针的操作

    3、函数的形参不会拥有新的空间(节约了空间)

     

    5、常引用

    1 int &a = 10;//err

    1. #include
    2. using namespace std;
    3. void tets4()
    4. {
    5. //a就叫常引用 不能通过a修改空间的值
    6. const int &a = 10;//ok
    7. cout<<"a = "<//10
    8. }
    9. int main(int argc, char *argv[])
    10. {
    11. tets4();
    12. return 0;
    13. }

    常引用 一般作为函数的参数 防止函数内部修改外部空间值

    1. #include
    2. using namespace std;
    3. //常引用 作为函数的参数 即节约了空间 又防止函数内部修改外部变量的值
    4. void printf_num(const int &a)
    5. {
    6. //a = 1000;//err
    7. cout<<" num = "<
    8. }
    9. int main(int argc, char *argv[])
    10. {
    11. int num = 10;
    12. printf_num(num);
    13. return 0;
    14. }

     

    6、引用作为函数的返回值类型

     1、通过函数返回值 在外界操作 函数内部申请的空间

    1. #include
    2. using namespace std;
    3. int& get_data(void)
    4. {
    5. static int data = 100;
    6. //不要返回 普通局部变量的 引用
    7. return data; //返回谁 外界的a就给data取别名
    8. }
    9. int main(int argc, char const *argv[])
    10. {
    11. int &a = get_data();
    12. cout<<"data = "<
    13. return 0;
    14. }

     

    c++内联函数

     1、inline修饰的函数就是内联函数。

    inline int myAdd(int x, int y)//inline必须出现在函数的定义处

    {

            return x+y;

     }

    内联函数为了继承宏函数的效率,没有函数调用时开销,然后又可以像普通函数那样,可以 进行参数, 返回值类型的安全检查,又可以作为成员函函数。

    内联函数:是在编译阶段 完成的替换。

    2、内联函数的特点:

    1、能保证参数的完整性

    2、有作用域的限制,可以成为类的成员

    3、类中的成员函数 默认都是内联函数(不用inline)

     内联函数的要求:

    不能存在任何形式的循环语句 不能存在过多的条件判断语句 函数体不能过于庞大 不能 对函数进行取地址操作。

    内联仅仅只是给编译器一个建议。

     3、宏函数和内联函数的区别

    • 宏函数: 预处理阶段完成替换、没有出入栈的开销、不能保证参数的完整性、没有作用域限 制、不能作为类的成员
    • 内联函数: 编译阶段完成替换、没有出入栈的开销、能保证参数的完整性、有作用域限制、能 作为类的成员

     

    c++(默认参数)缺省参数

    1、默认参数的定义

    c++在声明函数原型的时可为一个或者多个参数指定默认(缺省)的参数值,当函数调用 的时候如果没有传参,编译器会自动用默认值代替

    函数的默认参数值,即在定义参数的时候同时给它一个初始值。在调用函数的时候,我们可以省略含有默认值的参数。也就是说,如果用户指定了参数值,则使用用户指定的值,否则使用默认参数的值。

    1. #include
    2. using namespace std;
    3. int my_add(int a,int b = 100)
    4. {
    5. return a+b;
    6. }
    7. int main(int argc, char const *argv[])
    8. {
    9. cout<<my_add(10,20)<
    10. cout<<my_add(10)<
    11. return 0;
    12. }

     2、默认参数的注意点

     函数的默认参数从左向右,如果一个参数设置了默认参数,那么这个参数之后的参数都 必须设 置默认参数

    1 int fun(int a, int b, int c=10);//正確

    2 int fun(int a, int b=20, int c=10);//正確

    3 int fun(int a=30, int b=20, int c=10);//正確

    4 int fun(int a, int b=20, int c);//不正确

    3、默认参数一般在函数声明的时候 设置 

    1. #include
    2. using namespace std;
    3. int main()
    4. {
    5. double add(double a=3.2,double b=9.6);//在函数声明时设置默认参数
    6. cout<<add()<//使用默认参数
    7. return 0;
    8. }
    9. double add(double a=3.2,double b=9.5)//在定义函数时设置默认参数
    10. {
    11. return a+b;
    12. }

    c++函数的占位参数

    C++中函数的形参列表里可以有占位参数,用来做占位,调用函数时必须填补该位置

    1. //函数的占位参数,只输入数据类型,不用写变量名
    2. //void func1(int a, int )//第二个int为占位参数,如果调用这个函数,必须传入参数(包括占位参数的值)
    3. void func1(int a, int=10)//函数的占位参数也能有默认参数
    4. {
    5. cout << "this is func1" << endl;
    6. }
    7. int main()
    8. {
    9. func1(10, 20);//调用,如果没给默认参数就得输入
    10. func1(10);//给了就可以不用输入
    11. }
    1. #include
    2. using namespace std;
    3. int fun(int a,int){ //第二个int位占位参数,就相当于没给形参起名字
    4. //形参的作用范围就那个 ()内
    5. return a;
    6. }
    7. int main(){
    8. cout<<fun(10,10)<//调用的时候必须传两个值
    9. return 0;
    10. }

  • 相关阅读:
    Jquery 通过class名称属性,匹配元素
    复变函数在软件开发中的应用
    C++特性:继承,封装,多态
    redis和mongodb部署配置
    SSH服务
    HTTP 与 HTTPS-HTTP 与 HTTPS 有哪些区别?
    C++类与对象,构造函数,析构函数,拷贝构造函数
    LeetCode 面试题 08.02. 迷路的机器人
    【算法&消费者行为】算法性能预期如何增强冲动性购买?—推文分享—2024-07-16
    海外众筹服务商
  • 原文地址:https://blog.csdn.net/m0_69211839/article/details/131087435