毕业后才知道要学好一门语言,是不是很悲催。最近报了极客班的C++课程,才刚开始听侯捷老师的讲课。也许是之前在学校学的太渣,现在才了解inline和构造函数的一点自己一直都忽视的特性。
1.inline
在一个类内部声明并定义的函数都是inline函数,在类外部定义的inline函数在前面加关键字inline。inline函数一般都是简单的函数,能够提高函数运行的效率但比较耗性能。最重要的一点是,inline函数最终的决定权是编译器,程序员只能向编译器建议设置inline函数,编译器会根据函数的复杂程度,决定其是否为inline函数。
2.构造函数
在构造函数中,又一个特性我一直没有去考虑,那就是初始化和赋值比如Complex两个构造函数:
2.1 Complex(double x = 0, double y = 0): re(x), im(y) {};
2.2 Complex (double x, double y) { re = x; im = y };
2.1是初始化过程,给对象设定初值,2.2是给对象赋值过程,对象接收值,两者看起来作用一样,但后者比前者更消耗性能,在编程过程中,应根据实际情况,选择更好的编码。
(2016.7.12)
必须的说侯老师的讲解相当牛逼,每一个环节都是重点,全然没有废话,今天对参数传递和运算符重载有了一点新的认识。
3.参数传递
参数传递或者返回值都有一个重要的特性,可变或者不可变,以前一直觉得无所谓,对const关键字也是一知半解,现在对const算是有了一次亲密的接触。
在函数或者数据前面加const,表示数据内容只能读,而不能写,比如:
double real()const{return re;}可以获取一个re,但你无法修改这个re,如何你尝试去修改re,编译器就会报错。
4.参数传递和引用传递
参数传递我个人理解为直接传递,你要传递什么就一股脑的发送送过去,就像寄包裹一样,多有的东西都打包传递,而引用传递是我告诉你你要的东西在哪里,然后你自己去取。显然,前者更直接,更直观,更方便,但对系统而言负担就较大,后者虽然更难以理解,但更灵活也更轻便。特别是对于处理大量复杂数据来说,采用引用传递是更优的选择,不如你要传递一个很大的数组,用值传递就需要传递大量的字节,而用引用传递只需要四个字节。
需要注意的是临时对象不能使用引用传递,因为临时对象在程序执行完后,对象就会被销毁,对象地址就无法被引用。
5.this
在C++中,this是一个相当重要的角色,他指向的是一个对象本身,每一个对象都有一个this指针,并且是隐藏的定义。
比如:
complex &complex::operator+ (const complex &r)
{
return _doapl(this, r);
}
5.重载
c++中的函数重载是c++多态性的特征之一,也是c++有别于许多其他OOP语言的特征之一,函数重载我简单的理解为函数名相同,但函数里传递的参数类型不同,或者参数个数不同,系统会根据被调用函数中的参数类型或参数个数来自动识别采用哪一个函数。在函数重载中我们应该重点注重操作符重载,比如:
complex operator+(const complex &x, const complex &y)
{
return complex(real(x)+real(y), imag(x)+imag(y));
}
complex operator+(const complex &x, double y)
{
return complex(real(x)+y, imag(x));
}