2 thoughts on “c++知识点备忘”

  1. 节自:高质量C++/C编程指南--第十一章 其它编程经验: http://www.w3sky.com/0/288.html

    const成员函数

    任何不会修改数据成员的函数都应该声明为const类型.如果在编写const成员函数时,不慎修改了数据成员,或者调用了其它非const成员函数,编译器将指出错误,这无疑会提高程序的健壮性.

    以下程序中,类stack的成员函数GetCount仅用于计数,从逻辑上讲GetCount应当为const函数.编译器将指出GetCount函数中的错误.


        class Stack

        {

        public:

    void Push(int elem);

    int Pop(void);

    int GetCount(void) const; // const成员函数

    private:

    int m_num;

    int m_data[100];

        };

    int Stack::GetCount(void) const

        {

    ++ m_num; // 编译错误,企图修改数据成员m_num

    Pop(); // 编译错误,企图调用非const函数

    return m_num;

        }

    const成员函数的声明看起来怪怪的:const关键字只能放在函数声明的尾部,大概是因为其它地方都已经被占用了.

  2. 一句话:c++的引用可以看作受限的指针。

    转自:C++中引用与指针的比较: http://blog.csdn.net/yuhq/archive/2006/04/20/670583.aspx

     C++中引用与指针的比较

    l   C++引用与指针的比较

    引用是C++中的概念,初学者容易把引用和指针混淆一起。

    一下程序中,n是m的一个引用(reference),m是被引用物(referent)。

     int m;

     int &n = m;

    n相当于m的别名(绰号),对n的任何操作就是对m的操作。

    所以n既不是m的拷贝,也不是指向m的指针,其实n就是m它自己。

    l   引用的规则:

    (1)引用被创建的同时必须被初始化(指针则可以在任何时候被初始化)。

    (2)不能有NULL引用,引用必须与合法的存储单元关联(指针则可以是NULL)。

    (3)一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象)。

    以下示例程序中,k被初始化为i的引用。语句k = j并不能将k修改成为j的引用,只是把k的值改变成为6。由于k是i的引用,所以i的值也变成了6。

     int i = 5;

     int j = 6;

     int &k = i;

     k = j; // k和i的值都变成了6;

    引用的主要功能是传递函数的参数和返回值。

    l   C++语言中,函数的参数和返回值的传递方式有三种:值传递、指针传递和引用传递。

    l   以下是"值传递"的示例程序。

    由于Func1函数体内的x是外部变量n的一份拷贝,改变x的值不会影响n, 所以n的值仍然是0。

     void Func1(int x)

    {

     x = x + 10;

    }

    ...

    int n = 0;

     Func1(n);

    cout << "n = " << n << endl; // n = 0

    l   以下是"指针传递"的示例程序。

    由于Func2函数体内的x是指向外部变量n的指针,改变该指针的内容将导致n的值改变,所以n的值成为10。

     void Func2(int *x)

    {

        (* x) = (* x) + 10;

    }

    ...

    int n = 0;

    Func2(&n);

    cout << "n = " << n << endl;  // n = 10

    l   以下是"引用传递"的示例程序。

    由于Func3函数体内的x是外部变量n的引用,x和n是同一个东西,改变x等于改变n,所以n的值成为10。

    void Func3(int &x)

    {

    x = x + 10;

    }

    ...

    int n = 0;

    Func3(n);

    cout << "n = " << n << endl;  // n = 10

     

    对比上述三个示例程序,会发现"引用传递"的性质象"指针传递",而书写方式象"值传递"。

    实际上"引用"可以做的任何事情"指针"也都能够做,为什么还要"引用"这东西?答案是"用适当的工具做恰如其分的工作"。

     

    指针能够毫无约束地操作内存中的任何东西,尽管指针功能强大,但是非常危险。如果的确只需要借用一下某个对象的"别名",那么就用"引用",而不要用"指针",以免发生意外。

    ***********************************************

    另一篇深入讨论c++引用的文章:深入探讨C++中的引用:http://www.pcdog.com/p/html/2004121/11220041123_2.htm

    其中摘录一段关于常引用的:


    如果既要利用引用提高程序的效率,又要保护传递给函数的数据不在函数中被改变,就应使用常引用。

      2、常引用

      常引用声明方式:const 类型标识符 &引用名=目标变量名;

      用这种方式声明的引用,不能通过引用对目标变量的值进行修改,从而使引用的目标成为const,达到了引用的安全性。

      【例3】:

    int a ;

    const int &ra=a;

    ra=1; //错误

    a=1; //正确

Comments are closed.