钱能C++语言读书笔记(七)

    技术2022-05-20  60

    钱能C++语言读书笔记(七)

     

    1、  常成员函数(const Member Functions)

    成员函数的操作,如果只对对象进行读操作,则该成员函数可以设计为常(const)成员函数。设计为常成员函数的好处是让使用者一目了然就知道该成员函数不会改变对象值。同时让类的实现者更方便地调试,因为在常成员函数中,任何改变对象值的操作都将被编译器豪不留情地认定为错误。设计成常成员函数,与其说是使类的实现者更方便地调试,还不如说更方便软件设计师控制软件质量,尽量不让类产品有意外的失措,经验之谈是:能够成为常成员函数的,应尽量写成常成员函数形式。

            常成员函数的声明和定义形式上必须是一致,即在函数形参列表的右括号后面加上const。常成员函数的设计理念,更多的是让应用型编程者准确快速地明了成员函数的意义。

    2、  在类中声明静态成员函数, 要在成员函数名前加上关键字static。静态成员函数并不受对象的牵制,可以用对象名调用静态成员函数,这时候,将它看做是某一个名空间的一个函数,可以在没有任何对象捆绑的场合下访问静态成员的。

    静态成员函数的实现位置与成员函数的实现位置应该是在一起的,静态成员函数,

    如果不在类中实现,而在类的外部实现时,类名前应免去static关键字。成员函数的静态性只在的第一次声明的时候才是必要的。

    Demo代码如下:

    /* FileName: staticDemo.cpp Author: ACb0y Create Time: 2011年2月24日21:36:17 Last modify Time: */ #include <iostream> #include <string> using namespace std; //学生类 class Student { private: static int number; string name; public: void set (string str) { name = str; ++number; } static int printNumber() { cout << number << " total number" << endl; } void print() { cout << name << " -> students are " << number << " number" << endl; } }; //静态数据成员在类外分配空间和初始化 int Student::number = 0; void fn() { Student s1; s1.set("Jenny"); Student s2; s2.set("Randy"); s1.printNumber(); } int main() { Student s; s.set("Smith"); fn(); Student::printNumber(); return 0; }  

    运行结果如下:

    因为静态成员函数可以不捆绑对象的形式调用,静态成员函数调用时,没有当前对象的信息,所以静态成员函数不能访问数据成员,如果

    static int printNumber() 

    {

            cout << number << " total number" << endl;

    }

    改成:

    static int printNumber()

    {

    cout << name << " " << number << " total number" << endl;

    }

    则编译通不过,这并不是说它没有私有函数的访问权限,如果给该静态成员函数传递一个Student对象:

    static int printNumber(Student & s)

    {

    cout << "my name is " << s.name << endl;

    cout << s.number << " total number" << endl;

    }

    那么访问私有数据便有它的权利。


    最新回复(0)