C++学习笔记(一)

C++学习笔记(一),第1张

C++学习笔记

提示:本笔记是个人学习侯捷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变量,故此时返回值传递若为引用则会出错。

六、friend友元

友元函数可以使用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.构造函数一定使用初始列

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1325889.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-12
下一篇 2022-06-12

发表评论

登录后才能评论

评论列表(0条)

保存