• 困扰我的c++语法


    以下是我上周学习c++ primer的心得:

    1 数组引用作为形参

    c++允许将变量定义成数组的引用,以下列代码为例。形参为int (&arr)[10],该参数需分成两部分说明,引用名和
    引用定义。

    1. 引用名arr和&结合,表示其是一个引用
    2. 和下标运算符结合,表示其是一个数组的引用
    3. 和int结合,表示其是一个int型数组的引用
      值得注意的是,括号是必不可少的,否则形参就会变成一个整型引用数组
    void print( int (&arr)[10] ) 
    {
        for (auto elem : arr)
            cout << elem << endl;
    }
    

    2 声明一个返回数组指针的函数

    我们知道如何声明并初始化一个指向数组的指针:
    int a[10];
    int (*p)[10];
    p = a;

    但是如何去声明一个返回数组指针的函数呢,形式如下:
    Type ( *function(parameter_list) )[dimension]
    Type表示数组元素的类型,dimension是返回数组的维数https://www.zhihu.com/question/27860418
    实例:
    int ( *func(int i) ) [10];

    1. 函数名和形参是func(int i)
    2. 和 * 结合表示函数返回一个指针类型
    3. 和下标运算符结合表示其是指向数组的指针
    4. 和int结合表示其返回一个指向int型数组的指针

    定义一个返回数组指针的函数:

    #include <iostream>
    using std::cin;
    using std::cout;
    using std::endl;
    
    int odd[] = {1, 3, 5, 7, 9};
    int even[] = {0, 2, 4, 6, 8};
    
    int (*arrptr( int i ))[5] 
    {
        return (i % 2) ? &odd : &even; 
    } 
    
    int main(void)
    {
        int (*p)[5];
        p = arrptr(2);
    
        for (int i = 0; i < 5; i++)
            cout << p[0][i] << endl;
    
        return 0;
    }
    

    3 const成员函数

    int func(void) const { }类似这种将const放在形参列表之后的函数被称为const成员函数。

    在说明const成员函数之前,我们要先说说this指针。

    每个成员函数都包含一个隐式参数this,this指向该函数所对应的对象,默认的this指针的类型是一个常量指针(顶层const)并且指向非常量对象。无论我们使用诸如this.func()或者obj.func()(obj是具体的对象名),编译器都会将
    obj的地址传递给func的隐式参数this。但是由于this是一个指向非常量对象的指针,所以我们不能使用this去绑定一个常量对象。类似的,常量对象也不能调用普通的成员函数。举个栗子,

    class FooClass {
        public: 
            void foo(){}; 
    }
    int main(void) 
    {
        const FooClass a;
        a.foo();
    }
    

    在编译a.foo()时,编译器使用a的地址去初始化foo的隐式参数this,但是,这里的this指向的是一个非常量对象,所以无法绑定到对象a上去,因此 a.foo(); 是一条非法语句。只要将this转换成const FooClass *const 类型就可以实现本次调用。通过将函数foo声明为一个const成员函数就可以实现这一点。修改代码如下:

    class FooClass {
        public: 
            void foo() const{}; 
    }
    int main(void) 
    {
        const FooClass a;
        a.foo();
    }
    

    值得注意的是,const成员函数不能修改对象内的成员变量。

    参考

    C++ primer 5th edition
    https://www.zhihu.com/question/52468516?from=profile_question_card
    https://www.zhihu.com/question/27860418

  • 相关阅读:
    现代算法(一) 基因算法
    01-02周 学习总结
    Linux命令之touch详解
    Linux命令之umask详解
    Linux命令之wc详解
    Linux命令之stat详解
    Linux命令之tail详解
    Linux命令之head详解
    Linux命令之less详解
    Linux命令
  • 原文地址:https://www.cnblogs.com/dennis-wong/p/9076681.html
Copyright © 2020-2023  润新知