按照primer12.1的题目,在建辉和答案的帮助下写了我的第一个的类。
#include <iostream>
#include <string>
using namespace std;
int main()
{
class person
{
public:
person(const string &nm,const string &addr):name(nm),address(addr){}
string getname() const
{return name;}
string getaddress() const
{return address;}
private:
string name;
string address;
};
person me("jaja","sdf");
cout<<me.getname()<<endl;
system("pause");
return 0;
}
现在我说说我对这段代码的理解和我学到的东西。
一开始这个类只是这样的:
class person{
private:
string name;
string address;
}
然后我就为这个类写了构造函数。
person(const string &nm,const string &addr):name(nm),address(addr){}
nm和addr都是一个引用,引用用建辉的话来讲就是一个别名。它们和传进来的实参共用一个内存地址,所以改变nm和addr就是改变实参的值。而为了保护好实参不被改变,所以在string &nm前面加了const以保证nm不改变从而保护了实参。
又为什么不直接使用string nm和string addr定义形参反而要要引用在定义形参这么麻烦呢。因为引用使用的是地址传递,相对于不使用引用提高了效率。
还有,为什么写构造函数的时候初始化都写在了初始化列表而没有写在构造函数的函数体内。从建辉的笔记中可以看到这一句话:
没有默认构造函数的类类型的成员,以及const或引用类型的成员,不管是哪种类型,都必须在构造函数初始化列表中进行初始化。
在初始化列表中初始化只能用括号不能用赋值号;
我又接着写了两个函数用来获得对象的信息。
string getname() const
{return name;}
string getaddress() const
{return address;}
在函数形参表后面加const是保证类的数据成员不被改变。一旦类的数据成员发生改变,编译器就会报错。如果不是类的数据成员发生了改变,编译吃可以执行通过的。
例如:string getname() const
{
int n=0;
n++;
return name;
}
或者string getname( int n) const
{
n=0;
n++;
return name;
}都是正确的。这里的const强调的是类的数据成员,与其他费类的数据成员没有关系。
路还很长啊,要走快点。