Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用指针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++ - Fatal编程技术网

使用指针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类的对象应用
    操作符或通过应用来访问类的成员ode>->指向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();