"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或者相应类型的函数。
引入函数指针后,我们就可以通过指针调用函数、将函数指针作形参、将函数指针作为函数返回值。
函数指针也可以指向重载函数,但是要求形参必须精确匹配。