使用指针vs对象访问成员函数 你好,我开始学习C++,我在跟随一个视频教程系列。 为了简单起见,考虑下面的代码: #include <iostream> using namespace std; class Test{ public: Test(); void printCrap(); private: protected: }; Test::Test(){ }; void Test::printCrap(){ cout << "I don't get this yet..." << endl; }; int main(){ Test testOne; Test *testTwo = &testOne; testOne.printCrap(); testTwo->printCrap(); return 0; }; #包括 使用名称空间std; 课堂测试{ 公众: Test(); 无效打印垃圾(); 私人: 受保护的: }; Test::Test(){ }; 无效测试::printCrap(){ cout
使用指针vs对象访问成员函数 你好,我开始学习C++,我在跟随一个视频教程系列。 为了简单起见,考虑下面的代码: #include <iostream> using namespace std; class Test{ public: Test(); void printCrap(); private: protected: }; Test::Test(){ }; void Test::printCrap(){ cout << "I don't get this yet..." << endl; }; int main(){ Test testOne; Test *testTwo = &testOne; testOne.printCrap(); testTwo->printCrap(); return 0; }; #包括 使用名称空间std; 课堂测试{ 公众: Test(); 无效打印垃圾(); 私人: 受保护的: }; Test::Test(){ }; 无效测试::printCrap(){ cout,c++,C++,testTwo->printCrap()只是(*testTwo)的语法糖。printCrap(),没有更多,也没有更少。这不是一个好处或区别的问题。如果你有一个指针,你需要取消对它的引用以访问成员。->操作符相当于 testTwo->print(); (*testTwo).print(); // same thing. 如果您有您使用的实例(或引用) 这是语言语法-它与首选项无关简单地说,当通过调用的变量是实际对象或引用时,请使用。当变量是指向对象的指针时,请使用-> 通常,您更喜欢使
testTwo->printCrap()
只是(*testTwo)的语法糖。printCrap()
,没有更多,也没有更少。这不是一个好处或区别的问题。如果你有一个指针,你需要取消对它的引用以访问成员。->
操作符相当于
testTwo->print();
(*testTwo).print(); // same thing.
如果您有您使用的实例(或引用)
这是语言语法-它与首选项无关简单地说,当通过调用的变量是实际对象或引用时,请使用
。当变量是指向对象的指针时,请使用->
通常,您更喜欢使用实际对象或对象引用。指针是根据需要使用的。您经常需要使用指针的一些情况包括:
这只是一个记忆工作。当你分配它的时候
Test testOne;
当你指向一个对象时,你只需要在内存中创建一个对象
Text *testTwo = &testOne;
当测试一开始时,您指向同一位置。
您刚刚为同一部分内存创建了另一个名称。
当你需要把这个东西传递给一个函数时,你不想创建一个全新的对象,但你只想像这样指向它
function workWithObject(Test *testit)
因此testit指向与testTwo相同的内存部分,它是textOne。使用(点)运算符和->(箭头)运算符引用类、结构和联合的单个成员
点运算符应用于实际对象。箭头运算符与指向对象的指针一起使用
Test testOne;
Test* testTwo = &testOne;
这里testTwo是一个指向testOne内存位置的Test类型指针变量,要使用testTwo访问Test类的成员,需要使用->箭头操作符解除引用。可以通过对testTwo类的对象应用
操作符或通过应用->
来自C时间,有点冗余
在类内部,您也不需要任何运算符。只需调用printCrap。如果您在静态成员函数中查找,则使用::f.e.
testOne::staticPrint。
您有另一个类Test2,它是从原始测试继承的。Test2有自己版本的printCrap()函数。我们有两种调用方法:
//as member function
Test.printCrap();
Test2.printCrap();
//as pointer
ptr = &Test;
ptr->printCrap();
ptr = &Test2;
ptr->printCrap();
上面的代码仅说明了用法,没有说明哪一个更好。唯一的区别是
testTwo
可能包含无效地址(在一般情况下,不是在您的示例中)谢谢你提到1,2。引用也适用于多态性。嗯,我看到这为我澄清了一些事情,thanx。假设testTwo
是一个指针,而不是一个类(使用定义的运算符*
和/或->
)。
//as member function
Test.printCrap();
Test2.printCrap();
//as pointer
ptr = &Test;
ptr->printCrap();
ptr = &Test2;
ptr->printCrap();