c++面向对象学习笔记
1.防卫式声明
C++ 中的条件 Header Guards(防卫式声明)是条件编译指令,有助于避免由于程序员的错误多次定义相同的函数或变量时出现的错误。 根据 C++,当一个函数或一个变量被多次定义时,它会产生一个错误。
#ifndef _COMPLEX_ //COMPLEX是自定义的名字
#define _COMPLEX_
#endif
作用(防止):
定义同名函数
重复调用头文件
2.inline函数
在C语言中,如果一些函数被频繁调用,不断地有函数入栈,即函数栈,会造成栈空间或栈内存的大量消耗。
在c/c++中,为了解决一些频繁调用的小函数大量消耗栈空间(栈内存)的问题,特别的引入了inline修饰符,表示为内联函数。
inline仅是一个对编译器的建议
inline函数仅仅是一个对编译器的建议,所以最后能否真正内联,看编译器的意思:
它如果认为函数不复杂,能在调用点展开,就会真正内联,并不是说声明了内联就会内联,声明内联只是一个建议而已。
建议:inline函数的定义放在头文件中
因为内联函数要在调用点展开,所以编译器必须随处可见内联函数的定义,要不然就成了非内联函数的调用了。所以,这要求:
每个调用了内联函数的文件都出现了该内联函数的定义。
因此,将内联函数的定义放在头文件里实现是合适的,省却为每个文件实现一次的麻烦。
声明跟定义要一致:
如果在每个文件里都实现一次该内联函数的话,那么,最好保证每个定义都是一样的,否则,将会引起未定义的行为。如果不是每个文件里的定义都一样,那么,编译器展开的是哪一个,那要看具体的编译器而定。所以,最好将内联函数定义放在头文件中。
3.构造函数
complex(double r = 0, double i = 0)
: re(r), im(i) //初始列 initalization list
{ }
constructor(构造函数)可以有很多个 - overloading(重载)
ctors放在private区?
Singleton(单例类)!
顾名思义,单例类Singleton保证了程序中同一时刻最多存在该类的一个对象。
有些时候,某些组件在整个程序运行时就只需要一个对象,多余的对象反而会导致程序的错误。
Singleton模式的功能有两点:一是保证程序的正确性,使得最多存在一种实例的对象不会被多次创建。二是提高程序性能,避免了多余对象的创建从而降低了内存占用。
class Singleton
{
private:
static Singleton* sin;
Singleton(){}
public:
static Singleton* getInstance()
{
if(sin == nullptr)
sin = new Singleton();
return sin;
}
setup(...);
}
//A::getInstance().setup();
我们将构造函数声明为私有,这样就防止了任何人用new关键字创建对象,而只能调用函数的getInstance函数来获取单例指针。然后,检查是否有已经存在的对象,如果有,直接返回该指针,如果没有,创建对象并返回指针。
4.const member functions(常量成员函数)
C++的的const类成员函数类成员函数
我们知道,在C++中,若一个变量声明为const类型,则试图修改该变量的值的操作都被视编译错误。例如:
const char blank = ‘’;
blank = ‘’; // 错误
面向对象程序设计中,为了体现封装性,通常不允许直接修改类对象的数据成员。若要修改类对象,应调用公有成员函数来完成。为了保证const对象的常量性,编译器须区分不安全与安全的成员函数(即区分试图修改类对象与不修改类对象的函数)。例如:
const Screen blankScreen;
blankScreen.display(); // 对象的读操作
blankScreen.set(‘*’); // 错误:const类对象不允许修改
在C++中,只有被声明为const的成员函数才能被一个const类对象调用。
要声明一个const类型的类成员函数,只需要在成员函数参数列表后加上关键字const,例如:
class Screen {public:char get() const;};
5.参数传递 pass by value VS pass by reference(to const)
返回值传递 return by value VS return by reference(to const)
第一参数将会被改变
第二参数不会被改动(开辟新地方存储新数据)
6.friend(友元)
类的友元函数是定义在类外部,但有权访问类的所有私有(private)成员和保护(protected)成员。尽管友元函数的原型有在类的定义中出现过,但是友元函数并不是成员函数。
友元可以是一个函数,该函数被称为友元函数;友元也可以是一个类,该类被称为友元类,在这种情况下,整个类及其所有成员都是友元。