C++类编程(一)const的使用

  设计类时,考虑以下五点

  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=3,n=9;

    swapr(m,n);
    cout << "m " << m << " n " << n << endl;
    

    
    return 0;
}

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。

 
原文地址:https://www.cnblogs.com/wujing-hubei/p/5160967.html