实际上是做题时遇到的一点疑惑

1. 关于 this 指针:(选 B)

1742639945490

A. 构造函数用于初始化对象,在构造函数中可以使用 this 指针来区分成员变量和局部变量,或者通过 this 指针调用其他成员函数等。例如:

class MyClass {
public:
    int num;
    MyClass(int num) {
        this->num = num;  // 用于区分时必须明写 this
    }
};

B. 此时 this 指针是一个指向常量对象的指针,即 const 类型的指针,不能指向可以被修改的对象

class MyClass {
public:
    int num;
    void printNum() const {
        // this 指针指向常量对象
        const MyClass* constThis = this;
        // 可以使用 this 指针访问成员变量,但不能修改
        std::cout << this->num << std::endl;
    }
};
/*在实际使用中,const类型的成员函数依然可以使用this来指向调用它的对象,也可以访问其内容*/

C,D 都是正确的

2. 关于构造 / 析构函数的执行

不放题目就说一下:

构造函数

默认就有普通构造函数和复制构造函数(是浅拷贝,仅仅赋值),它们是重载的

但是,如果自己写了任意一种的构造函数,就不会在默认生成

可以使用

MyClass() = default

来显式指定生成默认的构造函数

另外,const 可以作为构造函数的重载区分,当定义的对象是 const 类型,它才会被自动调用。

析构函数

没有参数,不可重载,都是先入后出(同生存期时,包括对象数组),这是因为后面定义的对象析构时可能访问已销毁的前面的对象,所以这是 C++ 的标准要求的,跟怎么存储没有关系。

3. 关于成员函数 & const&static

常成员函数:

属于对象,不能通过 this 指针修改调用对象的非常数据成员 ,但是可以使用外部的数据 / 函数

并且可以修改外部数据(除 const 的数据),被调用外部函数也可以修改对象的非常数据成员

稍微复杂一点:

#include <iostream>
class AnotherClass {
public:
    void nonConstFunction() {
        std::cout << "Non-const function of AnotherClass." << std::endl;
    }
    void constFunction() const {
        std::cout << "Const function of AnotherClass." << std::endl;
    }
};
class MyClass {
public:
    void constFunction(const AnotherClass& anotherObj, AnotherClass& nonConstAnotherObj) const {
        // 可以调用 const 对象的 const 成员函数
        anotherObj.constFunction();
        // 以下代码会报错,不能调用 const 对象的非 const 成员函数
        // anotherObj.nonConstFunction(); 
        // 可以调用非 const 对象的非 const 成员函数
        nonConstAnotherObj.nonConstFunction();
    }
};
int main() {
    AnotherClass obj1;
    const AnotherClass obj2;
    MyClass myObj;
    myObj.constFunction(obj2, obj1);
    return 0;
}
//其实也不复杂,就是说如果用了其他对象,那么能否调用其中的函数,看那个对象本身是否可以调用
//但是话又说回来,如果那个对象的方法改变了本来这个对象的非const成员函数,依然是会报错的
//同理,被调用的对象不能调用调用对象的非const成员函数
总之就是:不能改变/使用本身对象里的非const成员(除被声明为mutable的成员数据),其他随意。

静态成员函数:

属于类,也可以通过对象调用,但是没有区别,只能使用静态成员数据 / 函数和外部数据 / 函数

提一下:

1. 静态成员数据不是在构造函数中初始化的(但是构造函数可以使用它),必须在类外以 类名::变量名=xxx 的形式初始化,不过,如果它同时是 const 的话,甚至可以直接在类内就定义(也可以不)

2. 常数据成员只能在构造函数的初始化列表中定义(除了上面那个情况),不能在函数本身或者外部

总之就是:static 类型的属于类本身,但是 const 属于对象,只有同时是 static 和 const 才能类内定义