类的继承变量和自有变量之间的区别
Posted
技术标签:
【中文标题】类的继承变量和自有变量之间的区别【英文标题】:difference between inherited and own variables of classes 【发布时间】:2014-07-31 15:26:39 【问题描述】:有人可以解释一下类的自身变量和继承变量之间的区别吗? 例如在这段代码中:
class First
public:
int test;
First::First()
test = 5;
;
class Second : public First
public:
void setTest(int test)
Second::test = test;
int Second::GetTestFirst()
return First::test;
int Second::GetTestSecond()
return Second::test;
;
int main()
int input;
Second * sec = new Second;
cin >> input;
sec->setTest(input); //for example 15
std::cout << sec->GetTestFirst();
std::cout << sec->GetTestSecond();
return 0;
GetTestFirst() 和 GetTestSecond() 的输出有什么区别?它指向同一个内存块吗?如果是同样的东西,哪个更好用?
【问题讨论】:
类中的合格成员定义无效且毫无意义。不要。 只有在派生类有同名成员时才需要限定符,因此您可以区分它们。但这应该避免。 任一类中只有一个成员变量。test
、First::test
和 Second::test
在 Second
中都指代同一事物。最好只使用test
。
你只声明了一个成员变量int test;在您的 First class 中,两个函数调用都引用了相同的内存位置 5。但是,如果您定义另一个变量 int test;在您的第二堂课中,他们将相应地做出不同的参考。另外,你必须知道二等也是一等。所以你可以这样做: Second *sec = new First();现在属于第一类的所有属性都将在第二类中。
【参考方案1】:
没有区别 - Second
对象只有一个 test
成员,继承自 First
。这么说
return First::test;
是多余的 - 你可以使用
return test
(没有this
作为其他答案状态 - 这也不是必需的)。你也不应该使用
Second::GetTestFirst()
和类似的。编译器完全知道它正在编译Second
。
GetTestFirst()
就够了。据我所知,您的代码中的所有First::
和Second::
都不是必需的。最后的观察:在 C++ 中,除非需要,否则不应使用动态内存。而不是
Second * sec = new Second;
你应该使用
Second sec;
之后是.
,而不是->
。
【讨论】:
好的,如果我想在子类中创建“void SetTest(int x)”怎么办?最好使用“First::test = x”还是“Second::x = x”?还是没关系? 在 child 中设置 setter 并在 parent 中设置 member 会很奇怪,但它是有效的。再说一遍——除非你需要区分不同的成员,否则你不应该使用First::
或Second::
。在您的示例中,只有一个成员 test
所以不要使用这些前缀,因为它具有误导性。【参考方案2】:
GetTestFirst() 和 GetTestSecond() 做同样的事情,因为 test 变量只在基类中定义。解决该变量的正确方法是使用 this 关键字;
return this->test;
【讨论】:
这不是“正确”的方式。没有必要使用this
,因为成员变量(包括从基类继承的变量)在成员函数的范围内。这只是不必要的打字。
使用this->
被认为是一种很好的做法,它对第一次阅读代码的人有很大帮助。
我同意,proper 是一个不正确的词。另外,是的,您不必使用 this 关键字。但是,我相信 this 在执行代码审查时是一个更强有力的声明。
@Kupto 根据谁的良好实践?请引用有信誉的来源。以上是关于类的继承变量和自有变量之间的区别的主要内容,如果未能解决你的问题,请参考以下文章