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

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

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

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

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

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

相关搜索:C++:如何返回指向非静态成员函数的指针?为什么我不能在类中有一个非整数的静态const成员?如何通过指向另一个成员函数的指针传递模板成员函数?如何使用'auto‘声明一个指向重载成员函数的指针?如何static_cast一个指向常量成员函数的指针?为什么重新分配一个指向const int的指针不会产生编译错误?使用指向成员函数的指针在另一个类中调用类构造函数如何创建一个指向函数的函数指针,并在IR代码中返回它?具有成员函数的两个类从另一个类获取指向对象的指针指向不存在的结构的指针作为另一个结构中的成员变量是什么意思?为什么我得到错误“const fn中的函数指针不稳定”,但它消失时,包装在一个新的类型?为什么我的函数不能调整指针的内容,除非我返回一个来赋值它为什么这个常量自动变量在为一个类的常量成员函数编译的range-for循环中?Embedded C:如果指向成员的指针是由同一文件中的fn传递的,我是否可以将静态结构的成员传递给另一个文件中的函数Prdct是指向结构变量项地址的指针。为什么我们再次使用&运算符?它已经是一个地址了为什么我需要让这个非友元==操作符重载一个成员函数,以避免“未定义的引用”错误?为什么定义一个带有非const常量的operand<函数的结构会破坏一些东西,如果您将它用作映射中的键呢?为什么要将一个数组作为一个实际的参数发送给函数,它需要一个指向数组的指针,需要两次取消引用才能访问该数组?我需要我的数组返回并数组回到另一个变量,同时还包括它以前的数组成员,我不知道如何处理它
相关搜索:
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

CC++ const

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

87710

this指针:概念、传值方式、注意事项、构造析构this特殊情况

在C++编程中,this指针是一个非常重要的概念。它是一个内置的指针,用于指向调用成员函数的那个对象。本文将详细解释this指针的含义、用法和注意事项。什么是this指针?...在C++中,每一个对象都有一个特殊的指针this,它指向对象自身。当我们在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将成员函数中的this指针设置为当前对象的地址。...,实现链式调用 }};在const成员函数中保持对象的常量性:在const成员函数中,this指针的类型会变为指向const的指针,保证了对象的常量性。...如果这个成员函数是const的,那么this的类型就是const T*,表示它指向的对象是不可修改的。this指针只能在类的非静态成员函数中使用,不能在全局函数或者静态函数中使用。...这里的&obj就是this指针,它被隐式地作为第一个参数传递给func()。这也解释了为什么我们可以在成员函数中直接访问对象的成员变量和其他成员函数,因为this指针已经提供了对对象的访问。

9610
  • 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成员函数会有修改成员变量的企图。

    57170

    const详解

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

    43330

    八、特殊成员

    静态成员函数没有this指针,因此它不能直接访问类的非静态成员变量或非静态成员函数。 静态成员函数可以直接通过类名和作用域解析运算符::调用,无需创建类的对象。...当需要实现与类相关但与类的任何特定对象无关的功能时。 静态成员提供了一种方式来处理与类相关但与类的实例无关的数据和函数。 this 在C++中,this 是一个特殊的指针,它指向当前对象的实例。...使用场景 返回当前对象的引用或指针:当你需要从一个成员函数返回当前对象的引用或指针时,可以使用 this 指针。...成员指针分为两类:指向成员变量的指针(也称为数据成员指针)和指向成员函数的指针(也称为成员函数指针)。 指向成员变量的指针 指向成员变量的指针声明时,需要指定其所属的类以及该成员变量的类型。...语法如下: 返回类型 类名::* 指针名; 其中,返回类型 是成员变量的类型,类名 是该成员变量所属的类,指针名 是指向成员变量的指针变量名。

    5210

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

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

    1.6K40

    CC++面试必备知识

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

    22930

    类和对象:运算符重载

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

    12310

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

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

    19210

    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数据成员

    60810

    const关键字应用总结

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

    52810

    const括号前括号后

    int z = 30; int* const ptr2 = &z; // ptr2 是一个常量指针,指向一个整型变量,不能改变 ptr2 的值(即它指向的地址),但可以修改 z 的值 //ptr2 =...void foo(const int& param) {     // 不能修改 param 的值 } 4. const 在函数返回类型中 当const用于函数返回类型时,它表示返回的对象是一个常量。...const int* getPointer() {     // ... } 5. const 在成员函数之后 当const出现在类成员函数的参数列表之后时,它表示该函数是一个常量成员函数,即该函数不会修改它所属对象的任何非静态成员变量...value;     } }; 总结来说,const在括号前后的位置决定了它是修饰指针本身、指针所指向的数据、函数参数、函数返回类型,还是类成员函数。...函数返回类型 当 const 用于函数返回类型时,它表示返回的对象是一个常量。这通常用于返回指向内部数据的指针或引用,以确保这些数据不会被调用者修改。

    6710

    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变量的指针。

    88790

    关于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成员函数中

    1.3K30

    指针讲解:*&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的成员函数。

    59810

    C++ const各种用法总结

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

    2K10

    this指针如何使C++成员指针可调用

    在C++中,this指针是一个隐藏的指针,指向当前对象实例。它在成员函数中自动可用,用于访问该对象的成员变量和成员函数。理解this指针的工作原理有助于理解为什么指向成员的指针是可调用的。...在本文中,我们将详细探讨this指针的概念,并通过具体的代码示例说明其在指向成员指针中的应用。1. 理解this指针每个非静态成员函数都有一个隐藏的this指针,指向调用该函数的对象。...指向成员变量的指针指向成员变量的指针用于指向类的成员变量。这种指针不能单独使用,必须结合特定的对象实例。...*ptr 指向成员变量value的指针,必须通过对象实例obj来访问。3. 指向成员函数的指针指向成员函数的指针用于指向类的成员函数。...4. this指针如何使成员指针可调用在调用成员函数指针时,编译器隐式地传递了this指针,使得成员函数可以访问当前对象的成员变量。这是为什么成员指针可以通过对象实例调用的原因。5.

    9610

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

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

    2.2K20

    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.6K10

    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对象的使用。

    1.1K20

    扫码

    添加站长 进交流群

    领取专属 10元无门槛券

    手把手带您无忧上云

    扫码加入开发者社群

    相关资讯

    热门标签

    活动推荐

      运营活动

      活动名称
      广告关闭
      领券