{
public: void print()const{ cout<<"No const";}
void test() { print();}
void test1() const {print();}
};
int main(int argc, char* argv[])
{
A a;
a.print();
a.test();
a.test1();
return 0;
}
void test1() const {print();} 常成员函数调用常成员函数,OK!
如果改成如下:
class A
{
public: void print(){ cout<<"No const";}
void test() { print();}
void test1() const {print();}
};
int main(int argc, char* argv[])
{
A a;
a.print();
a.test();
a.test1();
return 0;
}
void test1() const {print();} 常成员函数调用非常成员函数
则编译器会报错:
1>e:\poj\poj 1080 human gene function\poj 1080 human gene function\poj 1080 human gene function.cpp(9): error C2662: “A::print”: 不能将“this”指针从“const A”转换为“A &”
这个问题不是这样考虑的,常成员函数的对象只是只读访问,不允许修改对象的成员变量,所以不能调用非常成员函数,因为,这些成员函数可能修改成员变量。 而普通成员函数当然可以调用常成员函数class people
{
private:
char *name;
int age;
public:
people(char *namestr,int i);
people( const people& temp);
~people();
char *getname()const;
int getage()const;
};
people::people(char *namestr,int i)
{
int len=strlen(namestr);
name=new char[len+1];
strcpy(name,namestr);
*(name+len)='\0';
age=i;
}
people::people( const people& temp)
{
char* tempName=temp.getname();
int tempAge=temp.getage();
int len=strlen(tempName);
name=new char[len+1];
strcpy(name,tempName);
*(name+len)='\0';
age=tempAge;
}
people::~people()
{
delete name;
}
char *people::getname()const
{
return name;
}
int people::getage()const
{
return age;
}
void display(people x)
{
cout<<"people\'s name: "<<x.getname()<<endl;
cout<<"people\'s age: "<<x.getage()<<endl;
}
int main()
{
people p("xieyi",30);
display(p);
return 0;
}
//常对象只能调用常成员函数
people::people( const people& temp)
temp是常对象
temp.getname();
temp.getage();
temp调用函数getname(),getage()。
getname(),getage()必须是常成员函数
char *getname()const;
int getage()const;
如果修改程序为:
class people
{
private:
char *name;
int age;
public:
people(char *namestr,int i);
people( const people& temp);
~people();
char *getname();
int getage();
};
people::people(char *namestr,int i)
{
int len=strlen(namestr);
name=new char[len+1];
strcpy(name,namestr);
*(name+len)='\0';
age=i;
}
people::people( const people& temp)
{
char* tempName=temp.getname();
int tempAge=temp.getage();
int len=strlen(tempName);
name=new char[len+1];
strcpy(name,tempName);
*(name+len)='\0';
age=tempAge;
}
people::~people()
{
delete name;
}
char *people::getname()
{
return name;
}
int people::getage()
{
return age;
}
void display(people x)
{
cout<<"people\'s name: "<<x.getname()<<endl;
cout<<"people\'s age: "<<x.getage()<<endl;
}
int main()
{
people p("xieyi",30);
display(p);
return 0;
}
常成员函数意图调用非常成员函数:
编译会出现如下的错误:
e:\poj\poj 1080 human gene function\poj 1080 human gene function\poj 1080 human gene function.cpp(27): error C2662: “people::getname”: 不能将“this”指针从“const people”转换为“people &”
1> 转换丢失限定符
1>e:\poj\poj 1080 human gene function\poj 1080 human gene function\poj 1080 human gene function.cpp(28): error C2662: “people::getage”: 不能将“this”指针从“const people”转换为“people &”
1> 转换丢失限定符