<C++> const总结

本文详细解析了C++中const关键字的各种用法,包括修饰普通变量、引用和指针的不同情况,并介绍了如何通过const来控制变量的可变性。此外还提到了类成员函数中this指针的行为差异。

const 有const修饰的变量它是只读的。

和const相关的写法都在这里了。

//修饰普通变量
int value = 80;
const int const_var = 99; //值不可变 const int
int const const_var1 = 78; //值不可变 const int

//修饰引用
const int & constvar = value ;//值不可变
int const& constvar = value ;//值不可变

//修饰指针
//指针指向变量的值不可变 const int
const int * pconst_a = &value ; 

//指针指向变量的值不可变 const int
int const * pconst_b = &value ;

 //指针值不可变 const int*
int * const pconst_c = &value ;  

//指针指向变量的值不可变 const int 
//指针值不可变 const int*
int const *const pconst_d= &value ;

这么多写法,又加上不太注意自然而然记不住啊。于是我决定以后这么写。
const前面修饰什么就代表着什么不可以变。

//值不可变
int const value = 80;

//引用不可变

//指针 指向的值不可变
int const *pvalue = &value;

//指针 指针的值不可变

//指针 指针的值不可变和指向的值不可变
int const * const = &value;

总结一下,列举了和const变量相关的写法,提出了一个利于自己记忆的小窍门。我发现这里有一个bug,我没法控制别人怎么写const变量,也就是说如果我下次遇到const int* var可能还会懵逼,没办法那就回来查一下就行了。LOL

类中
非const函数中this指针为const classname*型,地址不可变地址所指向的值可变。

const函数中this指针为const classname const *型,地址不可变,所指向的值也不可变。

根据原作 https://pan.quark.cn/s/0ed355622f0f 的源码改编 野火IM解决方案 野火IM是专业级即时通讯和实时音视频整体解决方案,由北京野火无限网络科技有限公司维护和支持。 主要特性有:私有部署安全可靠,性能强大,功能齐全,全平台支持,开源率高,部署运维简单,二次开发友好,方便与第三方系统对接或者嵌入现有系统中。 详细情况请参考在线文档。 主要包括一下项目: 野火IM Vue Electron Demo,演示如何将野火IM的能力集成到Vue Electron项目。 前置说明 本项目所使用的是需要付费的,价格请参考费用详情 支持试用,具体请看试用说明 本项目默认只能连接到官方服务,购买或申请试用之后,替换,即可连到自行部署的服务 分支说明 :基于开发,是未来的开发重心 :基于开发,进入维护模式,不再开发新功能,鉴于已经终止支持且不再维护,建议客户升级到版本 环境依赖 mac系统 最新版本的Xcode nodejs v18.19.0 npm v10.2.3 python 2.7.x git npm install -g node-gyp@8.3.0 windows系统 nodejs v18.19.0 python 2.7.x git npm 6.14.15 npm install --global --vs2019 --production windows-build-tools 本步安装windows开发环境的安装内容较多,如果网络情况不好可能需要等较长时间,选择早上网络较好时安装是个好的选择 或参考手动安装 windows-build-tools进行安装 npm install -g node-gyp@8.3.0 linux系统 nodej...
<think>好的,我现在要回答用户关于C++中两种std::shared_ptr定义方式的区别的问题。首先,我需要明确用户的问题是什么。用户问的是'difference between 'std::shared_ptr<T> const res;' and 'const std::shared_ptr<T> res;' in C++',也就是两种声明方式的区别。 首先,我应该回忆一下C++const的放置位置对类型的影响。在C++中,const关键字的位置会影响它所修饰的部分。例如,const放在类型前和放在类型后是否有区别?记得在C++中,const放在类型前后的效果是一样的,比如const T和T const是等价的,都表示指向常量的指针,或者常量对象。不过这可能因具体情况而异,比如指针和引用的不同。 但这里讨论的是std::shared_ptr<T>的情况。用户给出的两个声明分别是: 1. std::shared_ptr<T> const res; 2. const std::shared_ptr<T> res; 根据C++的规则,const修饰的是它左边的部分。如果左边没有类型,则修饰右边的类型。例如,对于第一种情况,std::shared_ptr<T> const res,这里的const修饰的是std::shared_ptr<T>,所以res是一个常量shared_ptr,即指针本身是常量,不能被重新赋值,但指向的对象可以被修改(如果T不是const的话)。 而第二种情况,const std::shared_ptr<T> res,这里的const同样修饰的是std::shared_ptr<T>,所以实际上两种声明方式是等价的,都是声明一个常量shared_ptr对象,即指针本身不可变,但指向的对象是否可变取决于T是否为const。 但用户可能混淆的是,是否const的位置会影响所修饰的对象。例如,是否有类似的情况,比如指针的情况:const T*和T* const的区别。这时候前者是指向常量的指针,后者是常量指针。所以如果类比到shared_ptr,是否有一种情况是shared_ptr指向的对象是const,而另一种情况是shared_ptr本身是const? 这个时候,用户的问题中的两种情况是否对应这两种不同的情况?比如: - std::shared_ptr<const T> res; 这时候res是一个shared_ptr,指向的是const T,即对象不可变,但shared_ptr本身可以改变指向另一个对象。 - const std::shared_ptr<T> res; 这时候res是一个const的shared_ptr,即不能改变指向,但指向的对象T如果是非const的话,可以通过res修改。 所以用户的问题中的两种情况其实是同样的,即两种写法是等价的,都是声明一个const的shared_ptr,而shared_ptr指向的对象的constness由T是否带有const决定。 比如,用户的问题中的两个声明: 'difference between 'std::shared_ptr<T> const res;' and 'const std::shared_ptr<T> res;' 这两者的const都应用于shared_ptr本身,而不是指向的类型。所以它们都是声明一个不可变的shared_ptr,即不能重新赋值,但指向的对象如果是非const T,那么可以通过该shared_ptr修改对象的值。 而如果用户是想问std::shared_ptr<const T>和const std::shared_ptr<T>的区别,那就是完全不同的情况了。前者是指向const对象的shared_ptr,后者是指针本身不可变,但指向的对象可能可变。但用户的问题中的两种情况都是关于指针本身的const,而不是指向类型的const。 所以需要明确用户的问题是否是这两种情况的比较。但根据用户提供的例子,用户给出的两种情况都是对shared_ptr本身的const修饰,即指针是const,而指向的对象是否是const由T决定。 所以正确的回答应该是,两种声明方式是等价的,都声明了一个const的shared_ptr对象,即该指针不能被重新赋值,不能指向其他对象,也不能reset,但可以通过它修改所管理的对象(如果T不是const的话)。 然后需要确认,在C++中,const std::shared_ptr<T>和std::shared_ptr<T> const是否真的等价。根据C++标准,const放在类型名前面或后面对于类型本身来说是等价的,所以两种写法是相同的。例如: const int a = 5; int const b = 5; a和b都是常量整数,类型是const int,两种写法是相同的。 同样地: const std::shared_ptr<T> res; std::shared_ptr<T> const res; 这两种声明方式中的res的类型都是const std::shared_ptr<T>,即shared_ptr对象本身是常量。 因此,用户的问题中的两种声明方式没有区别,它们是等价的。所以用户可能存在的误解在于认为const的位置不同会导致不同的结果,但实际上在C++中,这两种写法是相同的。 不过,可能用户看到的是不同的编码风格,例如,有些人喜欢把const放在类型前面,而另一些人喜欢放在后面,尤其是在涉及指针的情况下。例如: const char* p; // 指向const char的指针 char const* q; // 同样是指向const char的指针 char* const r; // const指针,指向char(非const) 所以,在指针的情况下,const的位置会影响所修饰的对象。但是在模板类型的情况下,比如shared_ptr<T>,如果写成const std::shared_ptr<T>,那const修饰的是整个shared_ptr对象,即指针本身是常量。而如果写成std::shared_ptr<const T>,则是指向const T的指针,此时shared_ptr本身可以改变指向,但指向的对象是const的。 所以用户的问题中的两种情况都是关于shared_ptr本身的const,而和指向的对象是否为const无关,所以它们是相同的。因此,在回答中需要明确说明这两种写法是等价的,而如果有其他情况,如std::shared_ptr<const T>与const std::shared_ptr<T>,则它们的区别很大。 现在,我需要检查是否有相关的引用内容可以帮助回答这个问题。根据用户提供的引用内容,引用[1]、[2]、[3]主要讨论了shared_ptr<void>的使用以及转换问题,可能与当前问题无关。不过,我需要确保我的回答正确,并且如果有需要的话,是否引用了这些内容。但看起来这些引用更多是关于shared_ptr的类型转换和析构的问题,与const无关,所以可能不需要引用它们。 总结回答的结构: 1. 解释两种声明方式的语法差异。 2. 说明在C++中这两种写法的等价性,即都声明了一个const的shared_ptr对象。 3. 对比如果T是const的情况,例如std::shared_ptr<const T>,说明这不同的情况。 4. 示例代码展示两种声明的使用,例如尝试修改shared_ptr本身或所指向的对象。 5. 可能的相关问题,例如如何声明指向常量的智能指针,或者如何使shared_ptr本身不可变。 现在需要确保回答符合用户的要求,包括使用正确的中文,结构清晰,并且正确应用了系统级指令中的格式要求,比如行内公式用$...$,独立公式用$$...$$,但可能这里不需要数学公式。此外,生成相关问题。 现在,撰写正式回答: 用户询问的是两种std::shared_ptr定义方式的区别: 1. `std::shared_ptr<T> const res;` 2. `const std::shared_ptr<T> res;` 在C++中,`const`的位置在类型名前或后,若修饰的是整个类型,则两者等价。因此,这两种声明方式完全相同,均表示`res`是一个常量`std::shared_ptr<T>`对象。即: - `res`本身不可修改(不能重新赋值或重置指向其他对象) - 但通过`res`访问所管理的对象时,若`T`不是常量类型,仍可修改对象的值。 示例代码: ```cpp const std::shared_ptr<int> p = std::make_shared<int>(42); // p.reset(new int(10)); // 错误:p是常量,无法修改 *p = 100; // 正确:int不是常量,可以修改值 std::shared_ptr<int> const q = std::make_shared<int>(7); // q = std::make_shared<int>(8); // 错误:q是常量 *q = 9; // 正确:int值可修改 ``` 若需声明指向常量对象的智能指针,应使用`std::shared_ptr<const T>`,此时指针本身可变,但对象内容不可变: ```cpp std::shared_ptr<const int> r = std::make_shared<int>(5); r = std::make_shared<int>(6); // 正确:r本身不是常量 // *r = 7; // 错误:指向的是const int ``` 相关问题可能包括如何声明指向常量的指针,或如何组合const修饰符等。</think>在C++中,`std::shared_ptr<T> const res;` 和 `const std::shared_ptr<T> res;` 两种声明方式的区别如下: ### 1. **语义等价性** 两种声明方式完全等价,均表示 `res` 是一个**常量 `std::shared_ptr<T>` 对象**: - `const std::shared_ptr<T>` 和 `std::shared_ptr<T> const` 的 `const` 修饰符均作用于 `std::shared_ptr` 本身。 - `res` 的指针值(即其指向的地址)不可修改,但通过 `res` 访问的底层对象(若 `T` 非 `const`)仍可修改。 ### 2. **示例对比** ```cpp // 方式1: const修饰符后置 std::shared_ptr<int> const p = std::make_shared<int>(42); // p.reset(new int(10)); // 错误:p是常量,无法修改指针值 *p = 100; // 正确:int值可修改 // 方式2: const修饰符前置 const std::shared_ptr<int> q = std::make_shared<int>(7); // q = std::make_shared<int>(8); // 错误:q是常量 *q = 9; // 正确:int值可修改 ``` ### 3. **与 `std::shared_ptr<const T>` 的区别** 若需声明**指向常量对象的智能指针**,应使用 `std::shared_ptr<const T>`: ```cpp std::shared_ptr<const int> r = std::make_shared<int>(5); r = std::make_shared<int>(6); // 正确:r本身不是常量 // *r = 7; // 错误:指向的是const int ``` 此时 `r` 的指针值可修改,但底层对象不可修改。 ### 关键总结 - **`const std::shared_ptr<T>` 或 `std::shared_ptr<T> const`**:指针本身不可变,对象可变(若 `T` 非 `const`)。 - **`std::shared_ptr<const T>`**:指针可变,对象不可变。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值