c++几个关键字-----Explicit、Mutable、volatile

本文详细介绍了C++中的Explicit关键字如何阻止隐式转换的发生,并通过示例展示了如何使用它。此外,还介绍了mutable关键字如何使成员变量即使在const函数中也能被修改,以及volatile关键字的作用。

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

Explicit关键字:阻止隐式转换的发生,声明为explicit的构造函数不能在隐式转换中使用。

隐式转换即是可以由单个实参来调用的构造函数定义了一个从形参类型到该类类型的隐式转换。编译器在试图编译某一条语句时,如果某一函数的参数类型不匹配,编译器就会尝试进行隐式转换,如果隐式转换后能正确编译,编译器就会继续执行编译过程,否则报错。

class String{
public:
	explicit String(int n) {};
	//String(int n) {};
	String(const char *p) {};
};
 
void main()
{
	String s1 = 'a'; // 错误:不能做隐式char->String转换
	String s2(10); // 可以:调用explicit String(int n);
	String s3 = String(10); // 可以:调用explicit String(int n);再调用默认的复制构造函数
	String s4 = "Brian"; // 可以:隐式转换调用String(const char *p);再调用默认的复制构造函数
	String s5("Fawlty"); // 可以:正常调用String(const char *p);
}

Mutable关键字:mutable是为了突破const的限制而设置的。被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中,甚至结构体变量或者类对象为const,其mutable成员也可以被修改。(mutable在类中只能够修饰非静态数据成员

用例:

class Test
{
public:
    Test();
    int value() const;

private:
    mutable int v;
};
Test::Test()
{
    v = 1;
}

int Test::value() const
{
    v++;      //v若没有mutable关键字修饰,则无法修改v的值
    return v;
}


int main()
{
    Test A;
    cout <<  A.value() << endl;
    return 0;
}

运行结果: 输出 2

volatile关键字:作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。

变量如果加了 volatile 修饰,则会从内存重新装载内容,而不是直接从寄存器拷贝内容。 

 

 

 

 

<think>我们正在回答用户关于C++关键字的问题。根据用户需求,我们需要提供C++关键字列表及其用法详解。 注意:我们需要按照系统级指令的要求,对数学表达式使用$...$格式,独立公式使用$$...$$格式,使用中文回答,并在回答末尾生成相关问题。 同时,回答中引用的段落末尾需要自然地添加引用标识。 由于C++关键字较多,我们不可能在单个回答中详尽所有关键字的每一个细节,但可以给出主要关键字的概述和典型用法,并引导用户进一步查阅资料。 参考引用: [1]中提到了C/C++常用关键字,并给出了一些专栏链接,我们可以参考其中的分类和重点。 [2]中详细介绍了const关键字的用法,我们可以借鉴其思路。 我们将选取C++中一些重要且常用的关键字进行解释,包括:auto, break, case, char, const, continue, default, do, double, else, enum, extern, float, for, goto, if, int, long, register, return, short, signed, sizeof, static, struct, switch, typedef, union, unsigned, void, volatile, while, 以及C++特有的关键字如class, friend, inline, new, delete, operator, private, protected, public, template, this, virtual等。 由于篇幅限制,我们将对每个关键字进行简要说明,并给出典型示例。对于特别重要的关键字(如const, static, virtual等)会稍微详细一些。 注意:在代码示例中,我们使用C++代码,并确保语法正确。</think>### C++ 关键字列表及其用法详解 以下是 C++ 中常用关键字的分类详解,包含核心用法和代码示例: #### 一、类型修饰符 1. **`const`** - 定义不可修改的常量或保护函数参数/返回值 - 示例: ```cpp const int MAX = 100; // 常量 void print(const string& s) { /* 不能修改s */ } // 保护参数 ``` - 类中使用:`const` 成员函数不能修改对象状态[^2] 2. **`volatile`** - 防止编译器优化可能被外部改变的变量 - 示例:`volatile int sensorValue;`(硬件寄存器映射) 3. **`mutable`** - 允许 `const` 成员函数修改的成员变量 - 示例: ```cpp class Cache { mutable int accessCount; // 可在const函数中修改 int getValue() const { accessCount++; return value; } }; ``` #### 二、存储类说明符 1. **`static`** - 文件作用域:限制变量/函数仅在当前文件可见 ```cpp static int internalVar; // 仅本cpp文件可见 ``` - 函数内:保持局部变量状态 ```cpp void counter() { static int count = 0; // 每次调用保持值 cout << ++count; } ``` - 类成员:被所有对象共享 ```cpp class Player { static int totalPlayers; // 所有玩家共享计数 }; ``` 2. **`extern`** - 声明在其他文件中定义的变量 - 示例:`extern int globalVar;`(定义在另一个.cpp文件) 3. **`register`** (C++17弃用) - 建议编译器将变量存储在寄存器中 - 示例:`register int i;` #### 三、流程控制 1. **`if/else`** ```cpp if (x > 0) { /*...*/ } else if (x < 0) { /*...*/ } ``` 2. **`switch/case/default`** ```cpp switch(value) { case 1: /*...*/ break; case 2: /*...*/ break; default: /*...*/ } ``` 3. **循环控制** - `for`:`for(int i=0; i<10; ++i)` - `while`:`while(condition)` - `do-while`:`do {...} while(condition);` - `break`/`continue`:中断或继续循环 #### 四、面向对象 1. **`class`** 定义类(默认成员为private) ```cpp class MyClass { int data; // private默认 public: void method(); }; ``` 2. **访问控制** - `public`:类外可访问 - `protected`:仅派生类可访问 - `private`:仅类内可访问(默认) 3. **`virtual`** - 实现多态:`virtual void draw() = 0;`(纯虚函数) - 虚析构函数确保正确释放派生类资源 4. **`friend`** 授予其他类/函数访问私有成员的权限 ```cpp class A { friend class B; // B可访问A的私有成员 }; ``` #### 五、动态内存 1. **`new`/`delete`** 动态内存管理 ```cpp int* arr = new int[10]; // 分配数组 delete[] arr; // 释放数组 ``` 2. **`nullptr`** (C++11) 空指针常量:`int* ptr = nullptr;` #### 六、类型相关 1. **`auto`** (C++11) 自动类型推导 ```cpp auto x = 5; // int auto y = 3.14; // double ``` 2. **`using`** - 类型别名:`using Vec = std::vector<int>;` - 替代`typedef`:更清晰的语法 3. **`typedef`** 创建类型别名:`typedef int* IntPtr;` #### 七、异常处理 1. **`try/catch/throw`** ```cpp try { if (error) throw runtime_error("Oops"); } catch (const exception& e) { cerr << e.what(); } ``` #### 八、其他重要关键字 1. **`template`** 泛型编程 ```cpp template<typename T> T max(T a, T b) { return a > b ? a : b; } ``` 2. **`operator`** 运算符重载 ```cpp Vector operator+(const Vector& v) { /*...*/ } ``` 3. **`explicit`** 禁止隐式转换 ```cpp explicit MyClass(int x); // 必须显式构造 ``` 4. **`constexpr`** (C++11) 编译时计算 ```cpp constexpr int sqr(int x) { return x*x; } ``` > 关键设计原则: > - 优先用 `const` 保证不变性 > - 用 `namespace` 组织代码避免污染全局作用域 > - 多态接口优先使用 `virtual` 函数 > - 资源管理遵循 RAII 模式(构造函数获取,析构函数释放)[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值