首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

一个const成员函数,返回一个指向非const成员变量的指针,为什么它会好?

首先,让我们澄清这个 const 成员函数返回一个指向非 const 成员变量的指针的概念。在 C++ 中,const 成员函数可以访问和修改类的非 const 成员变量,因为它们是同一类别的对象,而 const 成员变量是只读的,不能直接修改它们的值。

因此,当 const 成员函数返回一个指向非 const 成员变量的指针时,这意味着该指针所指向的对象可以被该函数修改,这违反了指针和对象所持有的数据的 const 限制。

但是,如果该指针所指向的对象不是该函数内部创建的,而是在该函数外部创建的,并且该对象是 const 的,那么该函数可以返回该对象的指针,因为该指针所指向的对象不是该函数内部创建的,而是外部创建的,该对象是 const 的,该函数不能修改该对象,也不能修改该指针所指向的对象。

因此,当 const 成员函数返回一个指向非 const 成员变量的指针时,如果该指针所指向的对象是该函数内部创建的,那么该函数违反了 const 限制,如果该指针所指向的对象不是该函数内部创建的,那么该函数不违反 const 限制。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

CC++ const

2.const对象和对象const成员 const定义一个基本类型变量是不允许修改该变量值。const修饰类对象称为常对象,const修饰成员函数称为常函数。...(2)只有类静态成员函数可以被申明为常函数,原因是静态成员函数不含this指针,属于类级别的函数。其它类型函数(如外部函数等)不能被申明为常函数。...(3)一个两个成员函数,如果函数返回值类型、函数名、函数参数列表完全相同,一个是常函数一个是普通函数,那么它们构成重载关系。...(5)存在constconst版本成员函数时,普通对象若想调用const函数,应该通过建立该对象常引用或指向该对象指针。...(2)函数返回值是值类型时,被const修饰没有意义,因为此时返回值是一个左 值,本身就不能改变,上例中const int disp3(cons tint& ri)对返回const限定是多余

83810

C++中const小结

1、const修饰普通变量(指针变量) const修饰变量,一般有两种写法: const TYPE value; TYPE const value; 对于一个指针类型TYPE,这两种写法在本质上是一样...//q是一个普通指针,尽管他和p指向一个地址,却可以通过该指针改变指向内容 cout<<*p; return 0; } 3、const修饰函数参数 const修饰函数参数是它最广泛一种用途...4、 const 修饰函数返回const修饰函数返回值其实用并不是很多,含义和const修饰普通变量以及指针含义基本相同。...class A {    … void function()const; //常成员函数, 它不改变对象成员变量. 也不能调用类中任何const成员函数。...const修饰对象,该对象任何const成员函数都不能被调用,因为任何const成员函数会有修改成员变量企图。

53570

const详解

2.2.2 指针常量 当为指针常量时,指针常量值不可以修改,就是==不能指向别的变量==,但是==可以通过指针修改它所指向变量值==。...实参中,指针指向一段内存地址,调用函数之后,函数会产生一个临时指针变量,这个变量地址与实参地址不一样,但是这两个指针指向内存是同一块。...如果函数名、参数、返回值都相同const成员函数const成员函数是可以构成重载,那么const对象调用const成员函数const对象默认调用const成员函数。...const成员函数可以访问所有成员变量,但是只能访问const成员函数const成员函数,可以访问任何成员,包括const成员成员函数。...提高了效率 编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得成为一个编译期常量,没有了存储与读内存操作,使得效率也很高。

18130

《C++Primer》第十三章 拷贝控制

拷贝初始化除了在我们用=定义变量时会发生,在下列情况下也会发生: 将一个对象作为实参传递给一个引用类型形参 从一个返回类型为引用类型函数返回一个对象 用花括号列表初始化一个数组中元素或一个聚合类中成员...参数和返回值 在函数调用过程中,具有引用类型参数要进行拷贝初始化 当一个函数具有引用返回类型时,返回值会被用来初始化调用方结果 拷贝构造函数被用来初始化引用类类型参数,这一特性解释了为什么拷贝构造函数自己参数必须是引用类型...内置类型无析构函数,因此销毁内置类型成员什么也不做。 隐式销毁一个内置指针类型成员不会delete指向对象。但是智能指针是类类型,所以具有析构函数,因此指向对象在析构阶段会被销毁。...无论何时一个对象被销毁,就会自动调用其析构函数变量离开其作用域时被销毁 当一个对象被销毁时,其成员被销毁 容器(无论是标准库容器还是数组)被销毁时,其元素被销毁 对于动态分配对象,当对指向指针使用...这种允许移动成员函数通常使用与拷贝/移动构造函数和赋值运算符相同参数模式——一个版本接受指向const左值引用,另一个版本接受一个指向const右值引用。

1.5K40

类和对象:运算符重载

成员函数可以直接访问这些成员,因为它们是类一部分。 this指针成员函数一个隐式指针 this,指向调用该成员函数对象。...在成员函数内部,this 指针允许你访问对象成员变量和其它成员函数。全局函数没有 this 指针,因此无法访问特定对象状态。 自赋值保护:成员函数版本赋值运算符可以检查自赋值,即对象赋值给自己。...这个默认赋值运算符会进行成员成员简单赋值,也就是逐个复制每个引用、指针成员变量值。...return this; } // 注意:如果你还想要一个 const 版本 operator&(),你可以这样重载 Date* operator&(...: ①要修改对象成员变量函数不能加; ②只要成员函数内部不修改成员变量,就都应该加const,这样const对象和普通对象都可以调用。

7710

C++从入门到精通——const与取地址重载

在C++中,一个对象如果被声明为const,则表示该对象是只读,其成员变量不能被修改。因此,一个const对象只能调用其成员函数中被声明为const成员函数。...如果一个成员函数没有被声明为const,则默认是一个const成员函数const成员函数可以修改对象成员变量,因此不能被const对象调用。...示例 在C++中,const关键字用于修饰变量,表示该变量值不可修改。const修饰符同样也可以用于指针,表示指针指向内容是不可修改。...当一个指针被声明为const类型时,取地址操作符不会返回指针地址,而是返回指针指向内容地址。这是因为const关键字修饰指针表示其所指向内容是不可修改,因此不需要返回指针地址。...包含两个版本:一个是非const版本,另一个const版本。 在main()函数中,先后使用const指针const指针获取MyClass对象地址。

7810

CC++面试必备知识

修饰指针 const修饰指针——常量指针( const int *p = &a ),指针指向可以修改,但是指针指向值不可以修改。...const修饰常量——指针常量( int * const p = &a ),指针指向不可以修改,但是指针指向值可以修改。...const即修饰指针,又修饰常量(const int * const p = &a ),指针指向不可以修改,指针指向值也不可以修改. extren extern表明变量或者函数是定义在其他其他文件中...,存在于“栈内存(stack)”中,当GetMemory函数运行结束之后p内存释放了,将它返回给调用者去操作就自然出错; 有些初学者可能会好奇,明明以前开发时,经常会用到函数返回值,没出现过乱码?...造成这种不同原因,其实是因为返回类型不一样,函数返回返回值副本,如果你返回一个值那无所谓,这个值本身就是你需要,但如果像上述程序一样返回一个指针地址,因为此地址指向栈内存已经释放了

17730

const关键字总结

const关键字 被const修饰变量是不能改变 const修饰变量时,必须在声明变量同时给出初始化(类中const成员变量不一样) 顶层const与底层const 顶层const 定义为变量本身是一个常量...const f = &aa; //同时被顶层和底层const封锁指针既不能修改其指向,也不能修改其指向内容 return 0; } const函数 成员函数后使用const 就不能对此方法生命周期外变量值修改...可以用来修饰一个成员变量。被 mutable 修饰变量,将永远处于可变状态,即使是 const 函数中也可以改变这个变量值。...成员函数,类const对象可以调用const成员函数const成员函数 class Example { public: int getData() const { return m_data...Example e2; //正确,类const成员可以调用const成员函数const成员函数 e2.getData(); return 0; } 不能在类声明中初始化const数据成员

57810

const关键字应用总结

char* const pContent;` 还有其中区别方法,沿着号划一条线 如果const位于左侧,则const就是用来修饰指针指向变量,即指针指向为常量;如果const位于*右侧,const...const 修饰函数返回const修饰函数返回值其实用并不是很多,含义和const修饰普通变量以及指针含义基本相同。...类相关const const修饰成员变量 const修饰类成员函数,表示成员常量,不能被修改,同时只能在初始化列表中赋值。...//也不能调用类中任何const成员函数。 } 对于const类对象/指针/引用,只能调用类const成员函数,因此,const修饰成员函数最重要作用就是限制对于const对象使用。...const修饰对象,该对象任何const成员函数都不能被调用,因为任何const成员函数会有修改成员变量企图。

49410

C++之类和对象使用(三)

this指针  在每一个成员函数中都包含一个特殊指针,这个指针名字是固定,称为this指针。 它是指向本类对象指针值是当前被调用成员函数所在对象起始地址。...如果在常对象中成员函数未加const声明,系统把编译为const成员函数。 常成员函数不能调用另一个const成员函数。...const char *ptr; 定义指向变量指针变量一般形式为: const 类型名 *指针变量名; 1)如果一个变量已被声明为常变量,只能用指向变量指针指向。...不能用一般指向const变量指针指向;如 const char c[ ]="boy"; const char *p1; p1=c; char *p2=c;//不合法,p2不是指向变量指针变量...如果函数形参是指向const变量指针,在执行函数过程中显然不能改变指针变量指向变量值,因此允许实参是指向const变量指针,或指向const变量指针

84490

关于C++ const 全面总结

char* const pContent; (4)还有当中差别方法,沿着*号划一条线: 假设const位于*左側,则const就是用来修饰指针指向变量,即指针指向为常量; 假设const位于*右側...(2)const 修饰函数返回const修饰函数返回值其有用并非非常多,含义和const修饰普通变量以及指针含义基本同样。...4、类相关CONST (1)const修饰成员变量 const修饰类成员函数,表示成员常量,不能被改动,同一时候仅仅能在初始化列表中赋值。...· const修饰对象,该对象不论什么const成员函数都不能被调用,由于不论什么const成员函数会有改动成员变量企图。...i; }; 另一种方式就是在外部初始化, · 假设在const成员函数中,this指针仅仅是一个类类型;假设在const成员函数中, this指针一个const类类型;假设在volatile成员函数

50330

指针讲解:*&p和&*p 及const用法总结

*p和**p区别 int *p :一级指针,表示p所指向地址里面存放一个int类型值 int **p :二级指针,表示p所指向地址里面存放一个指向int类型指针(即p指向地址里面存放一个指向...; //含义是常量指针,p值不可以修改 p是一个指针指针p是常量,值无法修改,但是可以修改p所指向整型值。...4、const修饰函数返回const修饰函数返回值,防止函数返回值被修改 但是这里要注意是,必须也用const修饰变量来接收这个函数返回值。...6、const修饰类成员变量成员变量可以分为静态静态,如果const修饰是静态成员变量,可以在构造函数中对该变量进行初始化;如果const修饰是静态成员变量,则需要在类外对该变量进行初始化...const对象,不能引用const成员函数

51610

C++ const各种用法总结

然而如果该指针指向一个const 对象(如cdptr),可用其他方法修改其所指向对象。 那么如何将一个const 对象合法地赋给一个普通指针???...返回引用:const int &func2(); // 注意千万不要返回局部对象引用,否则会报运行时错误:因为一旦函数结束,局部对象被释放,函数返回指向一个对程序来说不再有效内存空间。...返回指针const int *func3(); // 注意千万不要返回指向局部对象指针,因为一旦函数结束,局部对象被释放,返回指针变成了指向一个不再存在对象悬垂指针。...4.修饰类成员函数返回const A operator+(const A &) const; // 前一个const 用来修饰重载函数operator+返回值,可防止返回值作为左值进行赋值操作。...编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得成为一个编译期间常量,没有了存储与读内存操作,使得效率也很高。

1.9K10

C++基础闯关100题,你能闯多少?【2021超硬核大厂高频面试题】

有了虚函数,基类指针指向基类对象时就使用基类成员(包括成员函数成员变量),指向派生类对象时就使用派生类成员,从而实现多态。...const成员函数const对象不可以调用const成员函数const对象都可以调用;不可以改变mutable(用该关键字声明变量可以在const成员函数中被修改)数据值。...static成员函数:不具有this指针,无法访问类对象static成员变量static成员函数;不能被声明为const、虚函数和volatile;可以被static成员函数任意访问。...浅拷贝: 在拥有指针成员类中,一个对象利用拷贝构造函数或者赋值函数拷贝或者赋值给另一个对象时候,直接将这个对象指针成员赋值给另一个对象指针成员,将一个指针赋值给另一个指针,就会使两个指针指向一个空间...如果该变量一个寄存器变量或者表示一个端口数据或者是多个线程共享数据,就容易出错,所以说volatile 可以保证对特殊地址稳定访问。 37、为什么析构函数一般写成虚函数

1.8K20

CC++中const作用总结

1、const修饰指针变量 定义只读变量,即常量  #define和const有什么区别 1)#define定义常量没有类型,所给出一个立即数;const定义常量有类型名字,存放在静态存储区...5)#define定义常量是不可以用指针指向const定义常量可以用指针指向该常量地址 6)#define可以定义简单函数const不可以定义函数 2、const修饰指针变量 //1...如果我们函数返回值是以 指针形式 返回,如果在函数前面加上const修饰,则表示指针指向内容是不能被改变,并且接收返回指针变量必须是const修饰。...class A { … void function() const; // 上面类中成员函数func,因为成员函数参数中会默认带上一个指向本类实例化对象this指针, // 而后面的const修饰就是这个...对于const类对象/指针/引用,只能调用类const成员函数,任何const成员函数都不能被调用。因此,const修饰成员函数最重要作用就是限制对于const对象使用。

94020

const 使用总结

这个const是修饰*,*代表是指针类型,所以表示指向一个const对象。...const用于成员函数默认情况下,this指针指向类类型非常量版本常量指针,比如对于类型class A{}; this类型相当于是A* const只能指向非常量对象,如果我们定义了一个常量对象...这就使得我们无法调用常量上成员函数,为了解决这个问题,需要将this声明为指向常量指针,即:const A* const this;但this指针是隐式,我们无法直接声明,解决方法就是将成员函数声明为...const,即在成员函数参数列表之后加上const关键字,表示this是一个指向常量指针,我们也这个成员函数为常量成员函数。...'a';上面的代码中,成员函数operator[]虽然定义为const,但却返回一个引用,从而允许对返回结果进行赋值,这就违背了常量本意,造成后果是未定义行为。

7610

CC++常见面试知识点总结附面试真题—-20220326更新

3. const 有什么用途 主要有三点: 1).定义只读变量,或者常量(只读变量和常量区别参考下面一条); 2).修饰函数参数和函数返回值; 3).修饰函数定义体,这里函数为类成员函数,被...const修饰成员函数代表不能修改成员变量值,因此const成员函数只能调用const成员函数, 可以访问const成员,但是不能修改; 4).只读对象。...指针和引用区别? 相同点: 1). 都是地址概念; 2). 都是“指向”一块内存。指针指向一块内存,内容是所指内存地址;而引用则是某块内存别名; 3)....细看拷贝构造函数 对于 class A,拷贝构造函数如下: A::A(const A &a){} 1) 为什么必须是当前类引用呢? 循环调用。...A f(); // 这个是不是可以看做声明了一个返回值为A函数函数名为 f,参数无 A g(A()); // 这个是不是可以看做声明了一个返回值为A函数函数名为 g, 参数类型为函数指针,这个函数指针返回值类型为

1.4K10

C++面试知识总结

指针常量不能修改指针指向地址,一旦初始化,地址就固定了,不能对进行移动操作。但是指针常量内容是可以改变。 2.16 指针函数函数指针区别 指针函数返回值是指针函数。...普通局部变量在定义函数内有效,这个函数返回会后失效。 static局部变量会自动初始化,而局部变量不会。...2.23 有一个char * 型指针刚好指向一些int 型变量, 我想跳过它们。 为什么((int *)p)++; 不行? 类型转换实质“把这些二进制位看作另一种类型, 并作相应对待”。...一个基类引用可以指向派生类实例。 3.12 static成员变量和static成员函数 static数据成员独立于该类任意对象而存在。...对于类成员函数,若指定其为const类型,则表明其是一个函数,不能修改类成员变量。 对于类成员函数,有时候必须指定其返回值为const类型,以使得其返回值不为“左值”。 4.

1.7K41

C++对象模型和this指针实例分析(一)

C++对象模型和this指针 成员变量成员函数分开存储 在C++中,类内成员变量成员函数分开存储 只有静态成员变量才属于类对象上 class Person { public: Person...this指针概念 通过4.3.1我们知道在C++中成员变量成员函数是分开存储一个静态成员函数只会诞生一份函数实例,也就是说多个同类型对象会共用一块代码 那么问题是:这一块代码是如何区分那个对象调用自己呢...this指针指向 被调用成员函数 所属对象 this指针是隐含每一个静态成员函数一种指针 this指针不需要定义,直接使用即可 this指针用途: 1.解决名称冲突:当形参和成员变量同名时...,可用this指针来区分 2.在类静态成员函数返回对象本身,可使用return *this 1.e.g.注意以下代码:传入形参并不会给成员属性age赋值!...0; } //this指针本质是一个指针常量,指针指向不可修改 //如果想让指针指向值也不可以修改,需要声明常函数 void ShowPerson() const { //常函数本质

26420

C++笔试面试题整理

const修饰类成员函数函数定义体):任何不需要修改数据成员函数都应该使用const修饰,这样即使不小心修改了数据成员或调用了const成员函数,编译器也会报错。...事实上,如果一个类中含有虚函数,则系统会为这个类分配一个指针成员指向一张虚函数表(vtbl),表中每一项指向一个函数地址,实现上就是一个函数指针数组。 什么是多态?...谈谈你对指针理解? 指针一个变量,该变量专门存放内存地址; 指针变量类型取决于其指向数据类型,在所指数据类型前加* 指针变量特点是它可以访问所指向内存。...当一个类A中没有生命任何成员变量成员函数,这时sizeof(A)值是多少,请解释一下编译器为什么没有让它为零。 为1。...单向传递,不能继承成员函数通过什么来区分不同对象成员数据?为什么它能够区分? 答:通过this指针指向对象首地址来区分。 对象都具有的两方面特征是什么?分别是什么含义?

2.5K30
领券