huihut / interview

📚 C/C++ 技术面试基础知识总结,包括语言、程序库、数据结构、算法、系统、网络、链接装载库等知识及面试经验、招聘、内推等信息。This repository is a summary of the basic knowledge of recruiting job seekers and beginners in the direction of C/C++ technology, including language, program library, data structure, algorithm, system, network, link loading library, interview experience, recruitment, recommendation, etc.
https://interview.huihut.com
Other
34.8k stars 7.97k forks source link

常对象,只能调用常成员函数、更新常成员变量? #41

Closed hbsun2113 closed 5 years ago

hbsun2113 commented 5 years ago

请问常成员变量为什么要被更新?

huihut commented 5 years ago

当常成员变量是指针的时候可以更新,如 https://github.com/huihut/interview/issues/12#issuecomment-469573886 中的 c

hbsun2113 commented 5 years ago

请问常成员变量是“常量指针”还是“常量指针”?(c应该是常量指针吧?) 当该指针是“指向常量的指针(常量指针)”时,这个指针也可以被称为“常成员变量”吗?

hbsun2113 commented 5 years ago

我大致明白了,您说的“常成员变量”应该是“常量指针”? 但这样的话,我们通过常对象只能更改常成员变量指向的值,而不能更新常成员变量吧?

huihut commented 5 years ago

我说的 常成员变量 确实是 常量指针更新常成员变量 也就是 对常量指针重新赋值,让它指向其他对象(修改它),但是还是不能修改它指向的对象。

但刚刚测试了一下,仓库中的例子 a (const A a; // 常对象,只能调用常成员函数、更新常成员变量)实际上是不能更新常成员变量(常量指针)的,应该是例子中的 b(A b; // 普通对象,可以调用全部成员函数)才可以。

#include <iostream>
using namespace std;

class A 
{
public:
    int a1;
    const int a2;
    const int* a3;
    A(int _i1, int _i2) :a1(_i1), a2(_i2), a3(&a1) {}
    void fun1() { a3 = &a2; std::cout << "fun1()" << std::endl; }
    void fun2() const { std::cout << "fun2() const" << std::endl; }
};

int main()
{
    A b(1, 2);
    b.a3 = &b.a2;       // 可以更新常成员变量
    std::cout << *b.a3 << std::endl;

    const A a(3, 4);
    a.fun1();       // 编译出错,不可以调用普通成员函数
    a.fun2();       // 可以调用常成员函数
    a.a3 = &a.a2;       // 编译出错,不可更新常成员变量

    return 0;
}