一些小知识点
关于C和C++
在C语言中,数据和方法(函数)是分开的,用数据来创造变量。
而在C++的类中(struct,class),数据和函数是可以放在一起的(成员数据,成员函数),由这两者共同产生对象。
关于class,也可以看作两大类:带有指针的和不带有指针的。
这两类在实现上有一定的区别,因为不带有指针的可以被class包含在一起。
而带有指针的(比如字符串),会在内存其他地方调用空间,在类中只有指向该空间的指针。
关于头文件
#ifndef ...
#define ...
...
#endif
这样的声明属于防卫式声明,可以防止多个文件中重复的include。
关于内联函数(inline)
内联函数可以解决一些频繁调用的函数大量消耗栈空间(栈内存)的问题。
这里提到一个inline候选人的概念,也就是说是不是真正的inline需要由编译器来决定,函数越简单越有可能。
如果函数在class内定义,则自动成为inline候选人。
如果在class外,可以在前面加上inline声明,但是能不能被选入要看编译器。
inline double imag(const complex& x){
return x.imag();
}
关于初始化列表
有时的构造函数会以初始化列表的形式出现。
class complex{
public:
complex (double r=0,double i=0)
:re(r),im(i){}
private:
double re,im;
}
也可以使用赋值的方法,比如re=r,但在效率上有差异,这也是使用初始化列表的原因。
这里的例子使用了默认实参,要注意默认实参重载时可能会与无参数发生冲突,编译器无法判断属于哪一类。
构造函数也可以放在private区,也就是不允许外界构造。(是一种设计模式Singleton)
关于const
后面会对const深入探讨,这里先引入一下。我们可以换个角度理解const。在你不想改变值的情况下就加上const,可以在函数后或者变量之前。
class complex{
public:
complex (double r=0,double i=0) :re(r),im(i){}
double real() const {return re;}
double imag() co