C++primer 第六章笔记 初稿

本文探讨了C++中参数传递方式,包括使用指针传递多维数组、可变形参initializer_list的应用、省略号可变参数的使用。同时介绍了return语句的新特性、函数重载规则、顶层const的作用及constexpr函数的特点。最后,通过实例展示了函数指针的运用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

6.1 参数传递

  1. 用指针来传递多维数组时,仍然需要传递二维的具体参数;
  2. 可变形参

    • initializer_list

    个人感觉就是一个容器?


  3. 代码如下
    class Class1{
    public:
        Class1(int a, initializer_list<int>b){}
    
    private:
        int a;
        int b;
    };
    class Class2{
    public:
        Class2(int a, int b){}
    private:
        int a;
        int b;
    };
    
    
    int main(){
        Class1 c1(1,{2});
        Class2 c2(1,2);
        return 0;
    }

    • 省略号

    莫名把赋值与判断合并就会出错,就很气
    想来第一个参数还是要的,没见过不加第一个参数的写法

    
    #include <string>
    
    
    #include <iostream>
    
    
    #include <cstdarg> 
    
    using namespace std;
    
    void fun(int n, ...){
        va_list vl;
        va_start(vl,n);
        int arg;
        do{
            arg = va_arg(vl,int);
            cout<<arg;
        }while(arg !=0);
        cout<<endl;
        va_end(vl);
    } 
    int main(){
        fun(1,2,3,4,0);
        fun(1,2,3,0);
        return 0;
    }

6.2 return语句

  1. return返回初始化列表也是可以的(初始化列表欢乐多!);
  2. using 相比于 typedef 的一大优越

    typedef int arr[10];//arr表示长度为10的int数组
    using arr = int[10];//等价
    arr* f(int i);
    arr* g(arr &a){
        return &a;//值得关注
    }
    
    int (*p)[10] = f(1);
  3. 尾置返回与decltype
    一大重要目的是降低阅读难度
    • 尾置返回

      int (*f(int i))[5]{}

      此函数可被化简为如下简明形式

      auto f(int i) -> int(*)[5]
    • decltype

      int a[5];
      decltype(a) *f(int i){}

6.4 函数重载

  1. 顶层const不能作为重载的要素;
  2. const_cast在重载中的应用

    const string &shorterString(const string &s1, const string &s2)
    {return s1.size() <= s2.size() ? s1 : s2;}
    
    string &shorterString(string &s1, string &s2){
        auto &r = shorterString(const_cast<const string&>(s1), const_cast<const string&>(s2));
    
        return const_cast<string &>(r);
    }
    

6.5 特殊用途语言

  1. 默认实参
    初始值不一定是字面值,也可以是表达式;

  2. constexpr函数

    • 只能有一条return语句;
    • 可以有形参,但必须也是常量表达式或字面值;
    • 函数内部不允许执行任何操作,但可以有类型别名;
  3. assert 与 NDEBUG

    • assert:用于判定,为假输出信息并停止程序运行,否则什么也不做;
    • NDEBUG:定义了即关闭调试状态
    • 形如:#ifndef NDEBUG
    • 几个预处理器定义的用于调试的变量
      • func存放函数名字
      • FILE存放文件名
      • TIME存放编译时间
      • DATE存放编译日期

6.6 函数指针

int f1(int a, int b){
    return a;
}

int f2(int a, int b){
    return b;
}
int main(){
    int (*p[2])(int, int) ={f1, f2};
    cout<<p[0](1,2)<<endl;
    cout<<p[1](1,2)<<endl;

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值