设计类时,考虑以下五点
1、构造函数初始化列表
2、函数该不该加const
3、参数传递尽量考虑用引用传递,考虑加不加const
4、返回用不用引用
5、数据尽量放在private,函数尽量放在public
一、构造函数
①构造函数参数名不能与类成员名相同
②只有当没有定义能和构造函数时,编译器才提供默认构造函数
③两种定义默认构造函数的形式
1、给已有构造函数的所有参数提供默认值.Stock(const string & co="Error",int n=0,double d=0.0);
2、通过函数重载,定义一个没有参数的构造函数。Stock();
④成员初始化参数列表。
Classy::Classy(int n,int m) : mem1(n),men2(0),men3(n*m+2)
{
//........
}
1、其只能用于构造函数
2、对非静态const数据成员,必须用器来初始化
3、对引用数据成员,必须用器来初始化
4、成员初始化的顺序与其在类声明中出现的顺序相同,与初始化器中的排列顺序无关
⑤析构函数
程序必须有一个析构函数,如果没有,编译器将默认的生成一个析构函数。当在构造函数中使用了new来分配内存时,必须使用delete来释放内存。
二、参数引用
引用变量的主要用途是将引用变量用作形参,使函数可以使用原始数据。引用是已定义变量的别名,与变量指向相同的值和内存单元。单独使用引用变量,在声明引用时必须将其初始化,而不是像指针那样,先声明后赋值。下面程序将看到传递引用时,函数将使用原始数据,改变引用将改变原始数据,与已往的按值传递不同。
#include<iostream> void swapr(int & a,int & b); int main()
{
using namespace std;
int m=,n=; swapr(m,n);
cout << "m " << m << " n " << n << endl; return ;
} void swapr(int & a,int & b)
{
using namespace std;
int temp;
temp=a;
a=b;
b=temp;
cout << "a " << a << " b " << b << endl;
}
结果如下
原始数据和形参的值都发生了交换。
由于改变引用的值,会同时修改原始变量,为了然函数使用传递的信息,而不对这些信息进行修改,同事用像使用引用,则可以使用常量引用,相比于普通变量,const变量属于不可修改的左值。
将引用参数声明为const引用有三个好处:
①使用const引用可以避免无意中修改数据的编程错误;
②使用const引用是函数能够处理const和非const实参,否则只能接受非const实参;
③使用const引用可以使函数能够正确的生成并使用临时变量。
函数参数使用引用、指针和按值传递的选择
对于使用传递的值而不作修改的函数
1、如果数据对象很小,如内置的数据类型或小型结构,则按值传递
2、如果数据对象是数组,则使用指针(唯一选择),并将指针声明为指向const的指针
3、如果数据对象是较大的结构,则使用const指针或const引用,提高效率
4、如果数据对象是类对象,则使用const引用
对于修改函数中数据的函数
1、如果数据对象很小,如内置的数据类型或小型结构,则使用指针
2、如果数据对象是数组,则使用指针(唯一选择)
3、如果数据对象是较大的结构,则使用指针或引用
4、如果数据对象是类对象,则使用引用
三、返回引用
返回引用可以提高效率。返回引用要注意的问题:避免返回函数终止时不存在的内存单元的引用(如在函数中生命的临时变量)。可以返回作为参数传递给函数的引用,也可以使用new分配新的存储空间,但要使用delete删除存储空间。
一般如果函数要返回局部对象的话,应该返回对象,而不是引用,如果函数返回一个没用公有复制构造函数的类的对象,这必须返回对象的引用。如果返回的对象需要修改,则返回非const引用,如果不修改,则返回const引用。
四、函数加const
只要类方法不修改调用对象,就应该将其声明为const。