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的成员函数那么就有可能改变这个对象的内容。
这就矛盾了,所以常对象只能调用常类型函数。
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;
}
#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
握个手~
#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的成员函数那么就有可能改变这个对象的内容。
这就矛盾了,所以常对象只能调用常类型函数。
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;
}
#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
握个手~
#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()
{