提示:本笔记是个人学习侯捷C++课程的总结笔记,欢迎来信指正批评!
第一篇 C++基础以及编程规范(一)
文章目录
- C++学习笔记
- 一、防卫式声明
- 二、头文件布局
- 类的声明和定义
- 三、模板
- 四、访问级别
- 五、构造函数
- 1.写在public部分,函数名与class名相同,没有返回类型
- 2.构造函数可以有很多个(重载)
- 六、参数传递和返回值传递
- 1.参数传递
- 2.返回值传递
- 六、friend友元
- 总结
提示:以下是本篇文章正文内容,下面案例可供参考
#ifndef __COMPLEX__
#define __COMPLEX__
……
#endif
若之前未定义COMPLEX时,定义并执行中间代码;若之后再定义COMPLEX时,不会再次定义执行中间代码。
二、头文件布局头文件布局涵盖:前置声明、类的声明、类的定义。
类的声明和定义类的声明:
class complex
{
public:
……
/*函数声明,未定义*/
complex& operator+= (const complex&);
/*函数若在class body中定义函数,便自动候选为inline,是否为inline最终由编译器决定*/
double real () const {return re;}
double imag () const {return im;}
private:
double re,im;
……
};
对于不会改变数据内容的函数,一定要加上const修饰符;否则对于常量对象会有异常报错。
{
const complex c1(2,1);
cout<<c1.real();
}
对于常量c1,存在矛盾逻辑,c1常量无法改变值;但是函数定义若无const意为可以改变,故存在矛盾。
三、模板
template<typename T>
class complex
{
public:
……
private:
T re,im;
……
};
{
/*使用时将c1和c2分别用double和int进行定义*/
complex<double> c1(2.5,1.5);
complex<int> c2(2,6);
}
四、访问级别
public:需要外界可以访问
private:只有class内部可以访问,一般数据都需要写在这部分,函数看需求
protect:类内和子类可直接访问,也就是说,基类中有protected成员,子类继承于基类,那么也可以访问基类的protected成员,要是基类private成员,则对于子类也是隐藏的,不可访问。
{
complex c1(2,1);
/*错误:re,im属于私有变量,不可直接访问*/
cout<<c1.re;
/*正确:通过public中的函数去返回变量值*/
cout<<c1.real();
}
五、构造函数
1.写在public部分,函数名与class名相同,没有返回类型
complex (double r=0,double i=0)
: re(r),im(i) /*初值列,只能在构造函数中使用,效率较高 */
{ }
2.构造函数可以有很多个(重载)
class complex
{
public:
/*重载函数1*/
complex (double r=0,double i=0)
: re(r),im(i) { }
/*重载函数1,错误,因为之前有默认参数,不可在定义无参函数,因为可能存在冲突*/
complex (): re(0),im(0) { }
/*重载函数2,该函数返回re*/
double real () const {return re;}
private:
……
};
/*重载函数2,该函数是给re赋值*/
void real(double r) { re=r;}
六、参数传递和返回值传递
class complex
{
public:
complex (double r=0,double i=0): re (r),im(i)
{}
/*前面有引用符号,return by reference*/
complex& operator += (const complex&);
/*前面无引用符号,return by value*/
double real () const {return re;}
private:
double re,im;
friend complex& __doapl(complex*,const complex&);
}
1.参数传递
{
/*传值,传递副本,修改不影响原值*/
complex c1(2,1);
complex c2;
/*传递引用可以加快传值速度,const可以防止函数对于参数的修改*/
c2+=c1;
cout<<c2;
}
2.返回值传递
{
/*前面有引用符号,return by reference*/
complex& operator += (const complex&);
/*前面无引用符号,return by value*/
double real () const {return re;}
}
在可以使用返回值引用传递的前提下尽量使用返回值引用传递。
如果函数中存在临时定义变量,在函数结束时该local变量释放故不可引用传递该local变量,故此时返回值传递若为引用则会出错。
友元函数可以使用class中的私有变量,破坏了一定的封装性,但是速度有所提升。
class complex
{
public:
……
private:
……
friend complex& __doapl(complex*,const complex&);
};
inline complex& __doapl (complex* ths,const complex& r)
{
ths->re += r.re;
ths->im += r.im;
return *ths;
}
相同的class的各个object互为friend
int func(const complex& param)
{ return param.re+param.im; }
总结
C++提高效率的方法总结:
1.数据一定放在private中
2.参数尽可能使用引用传递,看状况选择是否加const
3.返回值尽量以引用传递
4.类的body中的函数,一定先考虑是否加const
5.构造函数一定使用初始列
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)