C++的类中, 在成员函数的函数声明有末尾使用const 修饰, 则表明该函数为常量成员函数.
它具有以下两个特点:

  • 1 常量性: 常量成员函数约定不会修改类的任何数据成员, 即在函数体内不能修改类的任何非静态变量和调用任何非常量成员函数.
  • 2 对象调用: 常量成员函数可以被常量对象和非常量对象调用, 对于常量对象, 只能调用常量成员函数;而对于非常量对象, 常量成员函数和非常量成员函数都可以调用.

    (常量调常量, 非常随便调)

常量成员对象的定义:

class Myclass {
public:
    void setName(const std::string& newName); // 非常量成员函数
    void print() const;                  // 常量成员函数
private: 
    std::string name;
};

void Myclass::setName(const std::string& newName) {
    name = newName;
}

// 常量成员函数, 不会修改对象自己的数据
void Myclass::print() const {
    std::cout << "Myclass name: " << name << std::endl;
}

int main() {
    Myclass myc;
    myc::setName("Good");
    myc::print(); // output: "Myclass name: Good"
    
    const Myclass constMycls;
    // constMycls是常量对象, 所以不能调用setName
    constMyclass::print(); // output: "Myclass name: " name是空值
}

关于常量引用

在C++中,函数参数的类型可以分为传值调用(by value)、引用调用(by reference)和常量引用调用(by const reference)三种方式。在以上代码中,const std::string& newName是使用常量引用调用方式来传递参数。

使用const关键字修饰参数类型std::string&,表示这个引用参数是一个常量引用,即在函数内部不允许修改传入的参数。这样设计的目的有以下几点意义:

  1. 避免不必要的拷贝:使用常量引用作为参数,避免了对传入的字符串对象进行不必要的拷贝。如果不使用引用方式,而是直接使用std::string newName,则在函数调用时会进行一次拷贝构造,可能存在性能开销和内存消耗。
  2. 支持传递常量和非常量对象:使用常量引用作为参数,可以接受传入的常量字符串(const std::string)和非常量字符串(std::string),提高了函数的通用性。
  3. 保证不修改传入的参数:使用const关键字修饰参数类型,可以在函数内部明确表明该函数不会修改传入的参数,提升了代码的可读性,并保护了传入的字符串对象不会被意外修改。

总之,使用const std::string&作为参数类型,既可以避免不必要的拷贝开销,又能够支持传递常量和非常量对象,并且明确表示函数不会修改传入的参数。这样设计可以提高代码的效率和可读性。


Totn
10 声望5 粉丝

幼稚也没关系,去实践,去经历,去思考!