常成员函数只能调用常成员函数 常对象智能调用常成员函数

class A
{
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>          转换丢失限定符


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值