• 作者:井口裕香
  • 分类: C++

1.C++编程简介

推荐书籍

  • 《C++ Primer第五版》
  • 《Effective C++》
  • 《C++标准库》
  • 《STL源码剖析》

2.头文件与类的声明

Classes根据是否拥有pointer members分成两类,其中string的对象是一个指针,指向一个字符串。
1635584002879

自己声明的头文件用"",标准库头文件用<>
1635584023294

C++和C简单程序的不同写法:

Header头文件的防卫式声明:#ifndef __COMPLEX__用来判断是否定义过 complex.h头文件,如果没有定义过则用#define __COMPLEX__定义, #endif表示判断结束。
1635584062937

头文件的布局与声明:
1635584086939

1635584163186

类模板用于对象需要不同类型的参数的时候,其中类里面形参和实参都要写成T,对象声明时要加上参数的类型:
1635584192412

3.构造函数

inline可以让程序执行变快,函数在本体内定义,就自动成为inline,如果在外面定义就不是inline,但可以加上inline声明他是inline,但到底是不是inline是由编译器决定的,如果函数太复杂就不会是inline。

1635584225511

在类中,数据都应该被定义成私有的(private),私有变量不可以被对象取出,除非变量是共有的(public)。private和public可以交叉着写,不用写完全部的public再写private。

1635584597678

构造函数可以指定默认参数,同时切记构造函数前面没有返回值类型,下图中是构造函数的特殊语法用来初始化,如果将参数放到括号里面就是变量初始化后的赋值阶段了,效率会低。

不带指针的类多半不用写析构。

重载通常和构造函数一起使用,在函数编译后,函数名字其实是不同的。函数有了默认值,也可以去写重载函数,但是对于图中右边的c1和c2,使用左边的1和2都是可以的,所以对于图中情况不行。

4.参数传递与返回值

构造函数放在private里以后就不能在类外创建对象,但是这种写法通常用在单例模式Singleton中:

1635768746536 1635768770396

函数右边加上const说明对函数的操作并不会改变数据,于是这样不会改变数据的函数通常会在函数名右边加上const。

对象定义时前面加上const说明对象是不可以被改变的,如果函数不写const,就存在可能会更改对象的可能性(更改的话会报错),这样就和对象的定义矛盾,因此写上const更为周全。

1635769205075

传引用相当于传指针,大多数情况下希冀传参是引用,如果不希望传入参数被修改,就在类型后面加上&:

1635769474343

返回值和返回引用相比,尽量返回引用,同样在类型后面加上&:

1635769561597

通过声明友元可以获得类中private变量的值,但是这样的话会打破面向对象的封装性,其实也可以不写友元,通过函数来获取到,但是由于使用了函数效率会变低。

1635769866058

同一class定义出来的各个对象之间互为友元:

1635769900445

在下面图片中,ths指针指向的的re和im会被改变,而r的re和im不会被改变,所以传入的r引用前加了const。如果__doapl函数内写的是c = ths->re + r.re;,那么就不能再传引用作为返回值,因为在函数结束后,c会被销毁。

1635770261151

5.操作符重载与临时对象

重载的实现有两种方式,可以写成成员函数和非成员函数。实际上所有的成员函数都自带了一个隐藏的this指针,这个指针指向调用者,谁调用我我就指向谁:

1635853268352

下图中,引用用在传递函数参数和返回值的时候,左图中的ths,传进来的是一个指针,返回的是指针所指向的值,传递者无需知道接收者以何种方式接收

重载函数的返回值类型需要是complex而不能是void,因为在左边的连串赋值中,c2加完c1之和还需要传给c3加

1635853405872

下图中的非成员函数重载写出了三种不同情况下的函数,对应右边的加法。其中,非成员函数中没有this指针

非成员函数重载的返回值不能是引用,因为加法运算完成以后必须创建出来一个local object来接收,如果传引用,对象离开这个函数就死掉了,所以要利用返回

1635853880080

下图中,typename()表示创建临时对象,不需要给对象以名称,临时对象的生命在下一行代码就结束,右边三个对象也是临时对象。

1635854189314

下图中的取反功能两个函数,-函数中因为创建了一个新空间存放临时对象,所以必须返回值;而上边的+ 函数什么事情都没做,所以即可以返回引用,也可以返回值。

1635854539731

下图中<<函数把右边输出到左边cout身上,所以不能写成一个成员函数,只能写全局的

cout的类型是ostream,可以传引用,但是不能加const,如果加了const表示ostream在函数里面不能改变,其实ostream在每一次输出时候都在被修改

cout << c1 << conj(c1);是一个连串的输出,接收c1以后还要接收conj(c1),所以返回类型是ostream,如果只有一个<<,返回类型可以实void

1635854772204

6.总结

  1. 构造函数的初始化写法;
  2. 函数该不该写const
  3. past by refrence 还是 past by value
  4. 数据应该是private,而函数应该是public的
转载自: https://www.cnblogs.com/ironbox/p/15505950.html