const和explicit关键字
指针 - const
观察下面的参数
void exampleWithPointers() {// const在*左边 - 指向的内容是constvoid printString(const char* str) {// str[0] = 'A'; // 错误!不能修改指向的内容std::cout << str << std::endl;}// const在*右边 - 指针本身是constvoid fixedPointer(char* const str) {str[0] = 'A'; // 可以修改内容// str = nullptr; // 错误!不能修改指针本身}// 双重constvoid completelyFixed(const char* const str) {// str[0] = 'A'; // 错误!// str = nullptr; // 错误!}
}
const关键字在指针类型的左边,表示指针指向的内容不能修改。
在指针类型的右边,表示指针本身不能被修改。
类中的const
1、const修饰 类成员函数
将成员函数声明为const,表示该成员函数不会修改类的成员变量(除了被mutable修饰的成员变量)。
这样的函数可以被const对象调用。
class MyClass {
private:int data;mutable int counter; // 可以在const成员函数中修改public:// const成员函数 - 承诺不修改对象状态int getData() const {// data = 10; // 错误!不能在const成员函数中修改成员变量counter++; // 正确!mutable成员可以修改return data;}// 非const成员函数void setData(int value) {data = value; // 可以修改成员变量}// const重载void print() const {std::cout << "Const print: " << data << std::endl;}void print() {std::cout << "Non-const print: " << data << std::endl;}
};
2、const修饰 函数返回值
当函数返回值被const修饰时,表示返回的值不能被修改。这通常用于返回指针或引用,以防止返回的对象被修改。
class MathUtils {
public:// 返回const值 - 防止对返回值进行修改const int getConstantValue() {return 42;}// 返回const引用 - 避免复制,同时防止修改const std::string& getName() const {static std::string name = "MathUtils";return name;}// 返回const指针const int* getDataPointer() const {static int data = 100;return &data;}
};
explicit关键字
explicit关键字在C++中用于防止隐式转换。它主要用于修饰类的构造函数,表明该构造函数只能用于显式转换,不能用于隐式转换。这样可以避免编译器在你不期望的情况下进行自动类型转换,从而增加代码的安全性和可读性。
应用场景:
1、单参数构造函数:当一个构造函数只有一个参数时(或者有多个参数,但除了第一个参数外都有默认值),它可能被用于隐式转换。如果你不希望发生这种隐式转换,应该使用
explicit。2、多参数构造函数:在C++11及以后,
explicit也可以用于多参数构造函数,防止隐式转换。
