问题起由:
在学习句柄类的时候(到现在还没明白)敲击了如下代码
#include <iostream>
#include <string>
using namespace std;
class Cat{
public:
Cat():name("cat"){}
//Cat( const Cat& argCat){name=argCat.getName();} //此句子错误
Cat(const Cat& argCat);//类内部,可以访问私有变量
string getName()
{
return name;
}
private:
string name;
};
//Cat Cat::(const Cat& argCat){name=argCat.name;} 外部不可访问
void main()
{
Cat a;
Cat b(a);
cout << b.getName() <<endl;
}
(1)个问题为什么这个事错误的呢?传入构造函数的实参是Cat类型的const引用。该引用时const类型,所以在调用函数时候,必须调用const类型的函数。如果
string getName()
{
return name;
}
改为 const函数,可运行成功
string getName() const
{
return name;
}
(2)为什么第二个是正确的呢?Cat(const Cat& argCat){name=argCat.name;}
按道理分析Cat b(a); 传入a的引用。如果调用private成员,只能通过接口,但是argCat.name 没有通过接口,直接用对象调用的。
查了一下 :在类的内部,任何对象都是该类的友元对象。这样的话,就好理解了。
延伸: const函数能不能调用非const函数,能不能使用非const成员。
#include <iostream>
#include <string>
using namespace std;
class Cat{
public:
void hello()const;
void Cat::pri() ;
};
void Cat::hello()const
{
cout << "hello" <<endl;
pri(); //编译失败 调用的是非const的函数pri 。如果把pri声明定义成const类型则程序运行成功
}
void Cat::pri()
{
cout << "ok" <<endl;
}
void main()
{
Cat a;
a.hello();
}
仅仅限于函数。const函数可以调用const成员变量,也可以调用非const变量。 只是自己的小总结,如有错误,请指出。谢谢你们。