【发布时间】:2014-12-22 16:15:50
【问题描述】:
这听起来可能很愚蠢。在 C++prime 第 5 版 P258 中,它说:
默认情况下,this 的类型是指向类类型的非常量版本的 const 指针。例如,默认情况下,Sales_data 成员函数中 this 的类型是 Sales_data *const。
我可以理解 this* 是一个 const 指针,这意味着它指向的对象一旦初始化就不能改变。但是它说:
虽然这是隐式的,但它遵循正常的初始化规则,这意味着(默认情况下)我们不能将 this 绑定到 const 对象。
但我写了以下代码,它仍然编译得很好:
class Test{
public:
Test() = default;
Test(const string &s): teststr(" ") {};
Test(int a) : testint(a) {};
Test(const string &s, int a): teststr(s), testint(a) {};
string getstr() const { return teststr; };
int getint() { return testint; }; //there is no const here
private:
string teststr;
int testint = 0;
};
int main(){
Test a("abc",2);
cout << a.getint() << " ";
cout << a.getstr() << endl;
cout << endl;
return 0;
}
所以我的问题是: 如果编译器可以很好地编译它是否有'const',为什么这很重要? 然后书上说:
毕竟 isbn 的主体不会改变 this 指向的对象,所以如果 this 是指向 const 的指针,我们的函数会更灵活。
我想知道灵活性是什么?你能给我举几个例子吗?
【问题讨论】:
-
这本书具有误导性。
this不是“常量指针”。它是一个关键字,在评估时会产生一个合适指针类型的纯右值。既然是prvalue,就不能修改,就像不能说(1 + 2) = 3一样。 -
您混淆了“const 指针”(不能指向不同对象的指针)和“指向 const 的指针”(指向不允许更改的对象的指针指针)。
-
至于你想要的例子,把你的
main()的第一行改成const Test a("abc",2);,你会注意到你不能再调用getint()但是你可以 继续拨打getstr()。不改变对象的方法应该声明为const,因为这样它们就可以在给定const对象(或引用/指向const对象)时使用。 -
您的引用特别指出“默认情况下,this 的类型是一个 const 指针指向类类型的非 const 版本。例如,默认情况下,this 的类型在 Sales_data 成员函数中是 Sales_data *const"
-
你一直在输入
this*这不是一回事。请简单的this。
标签: c++ pointers const-pointer