"C++ Primer" 读书笔记 第七章 函数重载与函数指针

  类的成员函数

  const成员函数(常量成员函数)在函数原型声明的后面加一个const关键字,表示这个成员函数不能修改成员变量的值

  this指针是什么?有什么用?

  对于一个类的每一个成员函数(除了static函数)都有一个额外的隐含形参this, 在某个调用某个对象的成员函数时,this初始化为调用函数的对象的地址。

book_A.same_isbn(book_B);
// 实际上相当于下面的形式
Sales_item::same_isbn(this, book_B);
// 而this就是调用成员函数的对象的地址, 相当于
Sales_item::same_isbn(&book_A, book_B);

  因此,就很好理解成员函数后面加一个const关键字的意义了:this形参本来是Sales_item *类型,加上const为 const Sales_item * 类型,就只能访问成员变量(private也可以,因为连整个对象都拿过来了),但是不能修改成员变量的值(能不能修改上一例中另一个对象的值?)。

  另外,const对象(如const Sales_item a;)、指向const对象的指针或引用只能调用该对象中的const函数。

  this指针几乎没什么用,因为我们在定义类内部函数时,所有成员变量不用this->value也能直接用value访问。

 

  构造函数

  是特殊的成员函数,与类同名,没有返回类型。

  构造函数与普通成员函数一样,在类内声明,在类内/外都可以定义。

  一般建议在构造函数内部无非就是赋值时,在类中定义,是内联函数。这样开销更小。

  注意构造函数当然要放到public的访问标号下面。

  构造函数的初始化列表,位于花括号之前。无非是直接对类的成员变量赋值。

  默认构造函数按照变量初始化的规则初始化类中的所有成员。对于类类型的成员则调用其默认构造函数初始化;内置类型的初始化规则与普通函数一样:如果对象在全局作用域中被定义或者定义为static局部对象时,则成员将被初始化为0,否则将是未定义的。  

   

  函数重载

  函数重载的规则:

  1. 函数名必须相同

  2. 形参表必须不相同

  3. 返回的类型可以相同也可以不同

  4. 形参表不同是重载的充分必要条件,返回值不同是非充分非必要条件

  C++是如何实现函数重载的?名字修饰

  在进行编译时(源文件转汇编文件),函数、变量名将被重新修饰,变成全局唯一的名称。

  C语言中名字修饰只是在函数名前加下划线,因此不支持函数重载

  不同的编译器有不同的名字修饰规则

  特别地,如果我们希望在C++工程中将某些函数按照C语言的风格进行编译,可以用extern "C"修饰函数或者头文件实现。

 

  最后,当形参是引用或者指针时,形参是否为const对函数重载是有影响的。如果重载的两个函数有一个是const引用,则const实参当然优先用这个函数。指针同理。

  

  函数指针

  函数指针无非是指向函数的指针。既然是指针,必然只能指向特定的类型,一个函数指针也只能指向形参表和返回类型规定的一类函数。

  例如,现在我有一个函数int foo(const string &a, int * b); 那么,一个指向该函数的函数指针pointer2func应该这样被这样声明:int (*pointer2func) (const string &, int *);

  可以先用typedef简化函数指针的声明:typedef (*PF) (const string &, int *)

  则上述函数指针可以声明为PF pointer2func;

  注意函数指针的初始化和赋值:右边只能是0或者相应类型的函数。

  引入函数指针后,我们就可以通过指针调用函数、将函数指针作形参、将函数指针作为函数返回值。

  函数指针也可以指向重载函数,但是要求形参必须精确匹配。

posted @ 2019-06-29 17:39  LiaoQian1996  阅读(85)  评论(0编辑  收藏  举报