1. class有两种
2. 基于对象 与 面向对象
3. c++语言 与 c++标准库
4. 头文件的布局
#ifndef __COMPLEX__ (防止重复声明)
#define __COMPLEX__
0.前置声明(声明后面要用到的类和全局函数)
1.类声明(class head, class body)
2.class body外面定义成员函数,全局函数
#endif
5.一些细节
- 在class body内部定义的是inline函数,但只是给编译器的建议,最终是否inline由编译器决定。在函数定义的时候前面写上inline。
-
访问级别:public,private。数据和不对外使用的函数要声明为私有的。
-
构造函数:函数名称与类名相同,参数可以有默认值,写为初始化列表效率高(变量赋值两个阶段:初始化:re(r),im(i),赋值在{}中)。
构造函数可以有多个,overloading(重载)。
构造函数放在private区,表示不能在外界创建对象,单例模式。
- 不带指针的函数多半不用写析构函数。
- 函数() const {} 加const不改变数据内容。
外界const对象只能调用const函数,因为不加const修饰函数,编译器会认为这个函数可能改变数据,所以const对象不允许调用非const函数。
-
函数参数传递,pass by value VS. pass by reference (to const) 最好都传引用,若变量只有1个或两个字节传值也可以。
-
函数返回值,return by value VS. return by reference (to const) 尽量都用引用。
函数中需要返回的结果放置的位置:
(1)放在函数内部创建的对象(生命周期只在函数里)里,这时必须return by value。
(2)放在函数传入的参数里,这时都可以return by reference。
-
friends(友元):可以访问private成员。
-
相同class的各个objects互为friends。
例如.
class complex
{
public:
int func(const complex& param)
{ return param.re + param.im; }
private:
double re, im;
};
...
{
complex c1(2,1);
complex c2;
c2.func(c1);
}
-
操作符重载
(1)作为成员函数 this作为函数参数可以隐藏。
__doapl( do assaignment plus )
return by reference 语法分析:传递者无需知道接收者是以reference形式接收。
eg. c2 += c1; c1是传递者,c2是接收者。
c3 += c2 += c1;
(2)作为非成员函数
返回值一定要是value,因为返回的必定是个local object。
临时对象 定义
typename (..); 不需要写对象名 eg. complex(..,..); , int(7);
ostream& operator << (ostream & os, const complex &x) //返回值可以改为&。
{
return os << '(' << real(x) << ',' << imag(x) << ')';
}
cout << c1 << conj(c1); 级联输出,所以返回不能是void.