在一个类中定义了两个函数名相同的函数,其中一个是常成员函数,能帮我解释一下吗

时间:2022-11-13 20:05:49
#include<iostream>
using namespace std;
class MyClass{
public:
MyClass(int x):val(x){}
void Print()const{cout<<"const:val="<<val<<endl;}
void Print(){cout<<"val="<<val<<endl;}
private:
int val;
};
int main(){
const MyClass obj1(10);
MyClass obj2(20);
obj1.Print();
obj2.Print();
return 0;
}

程序输出结果:const:val=10
            val=20

在一个类中定义了两个函数名相同的函数,其中一个是常成员函数,这是函数的重载吗?
obj1是常对象只能调用常成员函数,obj1应该可以应该对两个Print函数都能调用啊,为什会调用第二个

11 个解决方案

#1


会调用最佳匹配的函数

#2


函数的const属性可以作为重载的条件。
obj1是const obj,只能调用const成员函数。
你可以这么理解声明obj是一个常对象,那么就是不想让他改变对象里面的内容。
如果常对象可以调用非const的成员函数那么就有可能改变这个对象的内容。
这就矛盾了,所以常对象只能调用常类型函数。

#3


函数是const可以重载

#4



如果这样的话就会调用相同的,但如果 void Print() 不注释则选择完全匹配。
#include <iostream> 
using namespace std; 
class MyClass

public: 
    MyClass(int x):val(x){} 
   void Print()const
   {
       cout <<"const:val=" <<val <<endl;
   } 
//     void Print()
//     {
//         cout <<"val=" <<val <<endl;
//     } 
private: 
    int val; 
}; 
int main()

    const MyClass obj1(10); 
    MyClass obj2(20); 
    obj1.Print(); 
    obj2.Print(); 
    return 0; 


引用楼主 qinqinluoluo 的帖子:
#include <iostream> 
using namespace std; 
class MyClass{ 
public: 
MyClass(int x):val(x){} 
void Print()const{cout < <"const:val=" < <val < <endl;} 
void Print(){cout < <"val=" < <val < <endl;} 
private: 
int val; 
}; 
int main(){ 
const MyClass obj1(10); 
MyClass obj2(20); 
obj1.Print(); 
obj2.Print(); 
return 0; 


程序输出结果:const:val=10 
            val=20 

在一个…

#5


const的对象调用const函数

#6



#include <iostream>
using namespace std;

class MyClass
  {
  public:
    MyClass(int x):val(x){}
    
    void Print()const
      {
        cout << "const:val=" << val << endl;
      }
    /*
    void Print() 
    {
      cout << "val=" << val << endl;
    }
   */
  private:
    int val;
  };
int main()
{
  const MyClass obj1(10);
  MyClass obj2(20);
  obj1.Print(); 
  obj2.Print();//编译器会去找最为匹配的函数原型; 上面将void Print()注释掉,系统将会调用void Print()const
  return 0;
}

output:
const:val=10
const:val=20

#7


嗯,const不能转为非const,会导致编译错误,因为非const可能会被改变;
而反过来是可以的。

#8


握个手~

引用 6 楼 yangch_nhcmo 的回复:
C/C++ code
#include <iostream>
using namespace std;

class MyClass
  {
  public:
    MyClass(int x):val(x){}
    
    void Print()const
      {
        cout << "const:val=" << val << endl;
      }
    /*
    void Print() 
    {
      cout << "val=" << val << endl;
    }
   */
  private:
    int val;
  };
int main()
{
  const MyClass obj1(10);
  MyClass obj2(20);
  obj1.…

#9


基础的C++书一般都会讲这个。建议重新找本书来读读。

#10



#include <iostream> 
using namespace std; 

class MyClass 
  { 
  public: 
    MyClass(int x):val(x){} 
    
    void Print()const 
      { 
        cout < < "const:val=" < < val < < endl; 
      } 
    /* 
    void Print() 
    { 
      cout < < "val=" < < val < < endl; 
    } 
  */ 
  private: 
    int val; 
  }; 
int main() 


#11



#include <iostream> 
using namespace std; 

class MyClass 
  { 
  public: 
    MyClass(int x):val(x){} 
    
    void Print()const 
      { 
        cout < < "const:val=" < < val < < endl; 
      } 
    /* 
    void Print() 
    { 
      cout < < "val=" < < val < < endl; 
    } 
  */ 
  private: 
    int val; 
  }; 
int main() 


#1


会调用最佳匹配的函数

#2


函数的const属性可以作为重载的条件。
obj1是const obj,只能调用const成员函数。
你可以这么理解声明obj是一个常对象,那么就是不想让他改变对象里面的内容。
如果常对象可以调用非const的成员函数那么就有可能改变这个对象的内容。
这就矛盾了,所以常对象只能调用常类型函数。

#3


函数是const可以重载

#4



如果这样的话就会调用相同的,但如果 void Print() 不注释则选择完全匹配。
#include <iostream> 
using namespace std; 
class MyClass

public: 
    MyClass(int x):val(x){} 
   void Print()const
   {
       cout <<"const:val=" <<val <<endl;
   } 
//     void Print()
//     {
//         cout <<"val=" <<val <<endl;
//     } 
private: 
    int val; 
}; 
int main()

    const MyClass obj1(10); 
    MyClass obj2(20); 
    obj1.Print(); 
    obj2.Print(); 
    return 0; 


引用楼主 qinqinluoluo 的帖子:
#include <iostream> 
using namespace std; 
class MyClass{ 
public: 
MyClass(int x):val(x){} 
void Print()const{cout < <"const:val=" < <val < <endl;} 
void Print(){cout < <"val=" < <val < <endl;} 
private: 
int val; 
}; 
int main(){ 
const MyClass obj1(10); 
MyClass obj2(20); 
obj1.Print(); 
obj2.Print(); 
return 0; 


程序输出结果:const:val=10 
            val=20 

在一个…

#5


const的对象调用const函数

#6



#include <iostream>
using namespace std;

class MyClass
  {
  public:
    MyClass(int x):val(x){}
    
    void Print()const
      {
        cout << "const:val=" << val << endl;
      }
    /*
    void Print() 
    {
      cout << "val=" << val << endl;
    }
   */
  private:
    int val;
  };
int main()
{
  const MyClass obj1(10);
  MyClass obj2(20);
  obj1.Print(); 
  obj2.Print();//编译器会去找最为匹配的函数原型; 上面将void Print()注释掉,系统将会调用void Print()const
  return 0;
}

output:
const:val=10
const:val=20

#7


嗯,const不能转为非const,会导致编译错误,因为非const可能会被改变;
而反过来是可以的。

#8


握个手~

引用 6 楼 yangch_nhcmo 的回复:
C/C++ code
#include <iostream>
using namespace std;

class MyClass
  {
  public:
    MyClass(int x):val(x){}
    
    void Print()const
      {
        cout << "const:val=" << val << endl;
      }
    /*
    void Print() 
    {
      cout << "val=" << val << endl;
    }
   */
  private:
    int val;
  };
int main()
{
  const MyClass obj1(10);
  MyClass obj2(20);
  obj1.…

#9


基础的C++书一般都会讲这个。建议重新找本书来读读。

#10



#include <iostream> 
using namespace std; 

class MyClass 
  { 
  public: 
    MyClass(int x):val(x){} 
    
    void Print()const 
      { 
        cout < < "const:val=" < < val < < endl; 
      } 
    /* 
    void Print() 
    { 
      cout < < "val=" < < val < < endl; 
    } 
  */ 
  private: 
    int val; 
  }; 
int main() 


#11



#include <iostream> 
using namespace std; 

class MyClass 
  { 
  public: 
    MyClass(int x):val(x){} 
    
    void Print()const 
      { 
        cout < < "const:val=" < < val < < endl; 
      } 
    /* 
    void Print() 
    { 
      cout < < "val=" < < val < < endl; 
    } 
  */ 
  private: 
    int val; 
  }; 
int main()