C++面向对象程序设计(Object Oriented Programming, OOP)
Object Based(基于对象)
面对的是单一class的设计
-class without pointer members
-class with pointer memebers
Object Oriented(面向对象)
面对的是多重classes的设计,classes 和 classes 之间的关系
-继承(inheritance)
-复合(composition)
-委托(delegation)
C++ 的历史
B语言(1969)
C语言(1972)
C++语言(1983)(newC ->C with Class -> C++)
Java语言
C#语言
C++ 演化
C++98(1.0) -> C++03(TR1,Technical Report1)-> C++11(2.0)-> C++14
C++包括C++语言和C++标准库
C++ programs 代码基本形式
.h(headerfiles):Classes Declaration(声明) + .cpp + .h(Standard Library)
注:延伸文件名(extension file name) 不一定是.h或.cpp,也可能是.hpp 或其他也可能无延伸名比如#include<cmath>
防卫式声明:
#ifndef __XXX__
#define __XXX__
#endif
编译器对头文件的预处理
1、编译器将处理掉所有注释,以空格代替;
2、删除#define,展开所有宏定义;
3、处理条件编译指令#if、#ifdef、#elif、#else、#endif;
4、处理#include,展开被包含的头文件(直接将头文件复制进文件)
5、保留编译器需要使用的#progma指令等等。
编译器还会做很多其他事情,但是从第四条可以看出,会将头文件中写的代码直接复制进文件。那么可以想象,如果有多份头文件均不进行防卫式声明,均包含了类似这种内容很多的头文件,经过预处理以后的文件,即便自己只写了一行代码cout,它包含的代码量将是相当的庞大。这还不是最关键的问题,关键是头文件中定义了一个变量,那么多次包含该头文件之后,就会产生重复定义的问题。
以下关于inline来自百度百科
关于inline(内联)函数: C++关键字,在函数声明或定义中函数返回类型前加上关键字inline,即可以把函数指定为内联函数。关键字inline必须与函数定义放在一起才能使函数成为内联,仅仅将inline放在函数声明前面不起任何作用。inline是一种“用于实现的关键字”,而不是一种“用于声明的关键字”。一般的,用户可以阅读函数的声明,但是看不到函数的定义。
背景
在C&C++中
一、inline关键字用来定义一个类的内联函数,引入它的主要原因是用它替代C中表达式形式的宏定义。
表达式形式的宏定义一例:
#define ExpressionName(Var1,Var2) ((Var1)+(Var2))*((Var1)-(Var2))
取代这种形式的原因如下:
1. C中使用define这种形式宏定义的原因是因为,C语言是一个效率很高的语言,这种宏定义在形式及使用上像一个函数,但它使用预处理器实现,没有了参数压栈,代码生成等一系列的操作,因此,效率很高,这是它在C中被使用的一个主要原因。
2. 这种宏定义在形式上类似于一个函数,但在使用它时,仅仅只是做预处理器符号表中的简单替换,因此它不能进行参数有效性的检测,也就不能享受C++编译器严格类型检查的好处,另外它的返回值也不能被强制转换为可转换的合适的类型,这样,它的使用就存在着一系列的隐患和局限性。
3. 在C++中引入了类及类的访问控制,这样,如果一个操作或者说一个表达式涉及到类的保护成员或私有成员,你就不可能使用这种宏定义来实现(因为无法将this指针放在合适的位置)。
4. inline 推出的目的,也正是为了取代这种表达式形式的宏定义,它消除了宏定义的缺点,同时又很好地继承了宏定义的优点。
此外还有一些规则需注意:
1、inline说明对编译器来说只是一种建议,编译器可以选择忽略这个建议。比如,你将一个长达1000多行的函数指定为inline,编译器就会忽略这个inline,将这个函数还原成普通函数。
2、在调用内联函数时,要保证内联函数的定义让编译器"看"到,也就是说内联函数的定义要在头文件中,这与通常的函数定义不一样。但如果你习惯将函数定义放在CPP文件中,或者想让头文件更简洁一点,可这样做:
以上方法是通用、有效的,可放心使用,不必担心在头文件包含CPP文件会导致编译错误。
一般的类的数据都会放在private里
构造函数
利用初值列赋初值效率更高.
构造函数可以有很多个-overloading(重载)
只要不是完全相同的函数(编译器理解的完全相同)
单例模式下构造函数放在private中
对不会做修改的加const修饰符
参数传递:pass by value / pass by reference (优先)
返回值传递:return by value /return by reference(优先)
C++中值传递、指针传递和引用传递
friend(友元)(百度百科)
友元可以是一个函数,该函数被称为友元函数;友元也可以是一个类,该类被称为友元类。
我们已知道类具有封装和信息隐藏的特性。只有类的成员函数才能访问类的私有成员,程序中的其他函数是无法访问私有成员的。非成员函数可以访问类中的公有成员,但是如果将数据成员都定义为公有的,这又破坏了隐藏的特性。另外,应该看到在某些情况下,特别是在对某些成员函数多次调用时,由于参数传递,类型检查和安全性检查等都需要时间开销,而影响程序的运行效率。
为了解决上述问题,提出一种使用友元的方案。友元是一种定义在类外部的普通函数或类,但它需要在类体内进行说明,为了与该类的成员函数加以区别,在说明时前面加以关键字friend。友元不是成员函数,但是它可以访问类中的私有成员。友元的作用在于提高程序的运行效率,但是,它破坏了类的封装性和隐藏性,使得非成员函数可以访问类的私有成员。不过,类的访问权限确实在某些应用场合显得有些呆板,从而容忍了友元这一特别语法现象。
作用及特点
友元提供了不同类的成员函数之间、类的成员函数与一般函数之间进行数据共享的机制。通过友元,一个不同函数或另一个类中的成员函数可以访问类中的私有成员和保护成员。c++中的友元为封装隐藏这堵不透明的墙开了一个小孔,外界可以通过这个小孔窥视内部的秘密。
友元的正确使用能提高程序的运行效率,但同时也破坏了类的封装性和数据的隐藏性,导致程序可维护性变差。
关于操作符重载:
1 关键字operator
2 注意返回的是值还是引用
3 cout是变的不可以加const cout 是ostream对象