C++ 中函数的参数加了&, const 和不加 有什么区别

本文解析了C++中std::string的不同参数形式及其影响,包括传值、引用及常量引用的区别,探讨了它们在函数传递过程中的作用及应用场景。

如下函数fun(int* in, const std::string& str)

{

}

一个参数都不加, 如 std::string str 和 std::sring& str 的区别是什么呢?

std:: string str 和 const::string str 使用的区别是什么呢?

如果把 const 和& 都加上又有什么不同呢?

 

 

std::string str和std::sring& str(单加 &)和const::string str (单加 const)和const::string& str(const和 &都加了) 4者有何区别呢?分别都是什么情况用?

 

 

class 成员 加上const 或者 & 有什么特别作用吗?

 

不加引用的话,str则被复制一份,函数中对str的操作实质上是对其复制品的操作,所以即使在函数中修改了str,调用层的原str并不会被改变。

加了引用的话,传入的str即是调用层的实际参数,这样省却了复制过程,效率会有提高。但如果函数中修改了str,则原str也会改变,因为其实是同一个东西。

有时候为了追求效率,又希望避免改变原来的str,则可在引用的基础上加const修饰,这样函数中就不能再修改str的内容(否则会编译出错)。

 

一个参数都不加, 如 std::string str 和 std::sring& str 的区别是什么呢?  
std:: string str 和 const::string str 使用的区别是什么呢?  
 答:std:: string str ,则str可以被修改,而const::string str ,则str不能被修改。
如果把 const 和& 都加上又有什么不同呢?  

答:对于有&,则不会调用拷贝构函造数,也就不会生成副本,函数里实际操作的是参实本身。

对于没有&,则会调用拷贝构造函数,生成实参的本,副你实际操作的是实参的副本,而不是实参本身。


std::string str和std::sring& str(单加 &)和const::string str (单加 const)和const::string& str(const和 &都加了) 4者有何区别呢?分别都是什么情况用?  
答:std::string str,str可以被修改,而且会调用拷贝构造函数。
std::sring& str,str可以被修改,但不会调用拷贝构造函数。
const::string str ,str不能被修改,但会调用拷贝构造函数。
const::string& str,str不能被修改,而且也不会调用拷贝构造函数。

<think> 我们正在讨论C++中成员函数末尾const的含义。根据引用资料,我们可以总结如下: 在C++中,成员函数末尾添const关键字表示该函数是一个常量成员函数const member function)。这意味着: 1. 该函数不会修改类的任何非静态成员变量(除非成员变量被声明为mutable)。 2. 隐含的this指针在该函数内是一个指向常量的指针(const pointer to const),即不能通过this指针修改对象的数据成员。 3. 常量对象(const objects)只能调用常量成员函数,而非const对象可以调用constconst成员函数。 4. 在函数声明定义中都必须const关键字,否则会被视为不同的函数,可能导致链接错误。 例如,考虑下面的代码: ```cpp class MyClass { public: int getValue() const; // 常量成员函数声明 void setValue(int val); // 非常量成员函数 private: int value; }; // 定义常量成员函数时也要const int MyClass::getValue() const { return value; // 允许,因为只是读取 // value = 10; // 错误:不能修改成员变量 } void MyClass::setValue(int val) { value = val; // 允许修改成员变量 } ``` 在这个例子中,`getValue`被声明为常量成员函数,因此它不能修改`value`。如果尝试在`getValue`函数中修改`value`,编译器会报错。 另外,const成员函数可以被const对象调用: ```cpp const MyClass obj; int x = obj.getValue(); // 正确,因为getValue是const成员函数 // obj.setValue(10); // 错误,因为setValue不是const成员函数const对象不能调用 ``` 非const对象则可以调用constconst成员函数: ```cpp MyClass obj2; int y = obj2.getValue(); // 正确 obj2.setValue(20); // 正确 ``` 如果成员函数需要修改某些特殊状态(比如缓存标记)但又希望该函数在逻辑上不改变对象状态,则可以将这些成员变量声明为`mutable`。例如: ```cpp class CachedValue { public: int getValue() const { if (!cacheValid) { // 由于cachedValue是mutable,所以可以在const成员函数中修改 cachedValue = computeValue(); cacheValid = true; } return cachedValue; } private: mutable int cachedValue; mutable bool cacheValid = false; int computeValue() const; // 假设这个函数const的 }; ``` 总结: - const成员函数保证了不会修改对象的状态(除非mutable成员),提高了代码的安全性可读性。 - const对象只能调用const成员函数,非const对象可以调用所有成员函数。 - 声明定义必须保持一致,都const§§相关问题§§ 1. 为什么const对象只能调用const成员函数? 2. mutable关键字在const成员函数中起什么作用? 3. 如何正确地在类外定义const成员函数</think> ### C++ 成员函数末尾 `const` 的含义详解 在 C++ 中,成员函数末尾添 `const` 关键字是一种核心语法特性,主要包含以下含义作用: #### 1. **函数行为约束** - 表示该成员函数**不会修改类的任何非静态成员变量**(对象状态) - 若尝试修改成员变量,编译器会直接报错: ```cpp class Time { int hour; public: void modify() const { hour = 12; // 编译错误:const函数禁止修改成员变量 } }; ``` 引用示例:[^3][^4] #### 2. **`this` 指针类型变更** - 编译器将隐含的 `this` 指针从 `T* const` 变为 `const T* const` - 即指针指向的对象变为常量,禁止通过 `this` 修改成员: ```cpp // 非const函数:this 类型为 Time* const // const函数:this 类型为 const Time* const ``` 引用说明:[^2][^4] #### 3. **常量对象调用权限** | 函数类型 | const 对象 | 非 const 对象 | |----------------|------------|---------------| | **const 函数** | ✓ 可调用 | ✓ 可调用 | | **非 const 函数** | ✗ 不可调用 | ✓ 可调用 | 示例: ```cpp const Time t1; // 常量对象 Time t2; // 非常量对象 t1.getHour(); // 正确:调用const函数 t1.setHour(12); // 错误:常量对象不能调用非const函数 ``` 引用依据:[^2][^5] #### 4. **`mutable` 成员的例外** ```cpp class Counter { mutable int cache; // mutable成员 public: void update() const { cache++; // 允许修改:mutable不受const约束 } }; ``` `mutable` 修饰的成员可在 const 函数中修改[^2][^4] #### 5. **语法强制要求** - 声明定义必须**同时添** `const`,否则视为不同函数 ```cpp // 声明 class MyClass { int getValue() const; }; // 定义 int MyClass::getValue() const { // 必须带const return value; } ``` 缺少 `const` 会导致链接错误[^3][^4] #### 6. **设计意义** - **安全性**:防止意外修改对象状态 - **可读性**:明确标识只读函数 - **接口设计**:支持常量对象操作 - **常量正确性**:核心的 C++ 设计哲学 > ⚠️ 注意:静态成员函数不能 `const`,因为静态函数无 `this` 指针[^2][^4] ### 典型应用场景 1. **Getter 方法**: ```cpp int getX() const { return x; } // 安全获取成员值 ``` 2. **常量对象操作**: ```cpp const MyClass obj; obj.printInfo(); // 需声明为 void printInfo() const; ``` 3. **容器操作**: ```cpp std::vector<MyClass>::const_iterator it; it->getData(); // 需要const成员函数 ``` ### 总结图示 ```mermaid graph LR A[const成员函数] --> B[禁止修改非mutable成员] A --> C[this指针变为const] A --> D[常量对象可调用] B --> E[编译时强制检查] D --> F[保证常量正确性] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值