C++关于函数的一些笔记

it2022-05-06  5

1.关于内联函数  内联函数关键字:inline,示例:inline int Function(){return 666;} 它可以像普通函数一样被调用,但是在调用时并不通过函数调用的机制,而是通过将函数体直接插入调用处来实现的。 一般来说inline用于定义类的成员函数,另一种是在类内声明,但是在类外定义的成员函数,这种情况一定要在函数前面加上inline。 据说,如果内联函数的函数体内容过多,系统会把内联函数当作普通的函数处理,这可能是一种安全措施? 这里顺便提一下“宏”这个概念,以前经常听说鼠标宏开挂,不知道是不是一回事?给人的感觉就是一套自动连续操作脚本。 宏定义在使用时只是简单的文本替换,并没有做严格的参数检查,也就不能享受C++编译器严格的类型检查。 它的返回值也不能被强制转换为可转换的合适的类型,它的使用会存在着一系列的隐患和局限性。

2.关于构造函数 构造函数是用于对对象进行自动初始化的。 其名字和类的名字一样,并且不写返回值类型(void 也不写)。 猜测构造函数都有统一的返回类型,应该就是构造对象本身。 构造函数可以被重载,即一个类可以有多个构造函数。 如果类的设计者没有写构造函数,那么编译器会自动生成一个没有参数的构造函数,虽然该无参构造函数什么都不做。 例如:LineData(){} C++ 规定,任何对象生成时都一定会调用构造闲数进行初始化。对象一旦生成,就再也不会在其上执行构造函数。 所以说,构造机会只有一次,构造函数可以大略的对对象的各种属性赋初值,但是细分的地方需要其它额外操作。 这里有一个问题要注意,一旦写了任何一个其它构造函数,哪怕是带有参数列表的,感觉与无参型函数不冲突的构造函数, 也会导致默认的无参构造函数失效,这个时候需要主动再写一个无参构造函数,否则以下两种创建对象的方式会报错。 LineData data;   LineData* data =  new data;   另外还有一点,应该只是构造函数可以使用的函数简写方式 一个普通的有赋值操作的无参构造函数: LineData() {     pair=120;//或者this->pair,是一个意思,构造函数都是对于构造对象而言的属性 } 可以简写成: LineData():pair(120){} 同理,如果带有参数的构造函数也能简写成: LineData(int n):pair(n){}//这样n会赋值给pair 在有参数情况下,可能会用到this关键字,有的时候我们会把外传参数与属性值写成名字一样的情况: LineData(int pair) {     this->pair=pair; } 由于外传变量与属性重名会产生歧义,所以在这里this->的作用就体现出来了,指明是当前正在被构造的对象的某某属性。

3.关于析构函数 示例:~LineData(){} 局部变量在函数执行完毕后会被析构,一般常见于函数末尾的return语句,会自动析构。 但是被关键字new所创建出来的对象,需要用dalete关键字去主动析构。 析构的主要目的还是为了缓解内存的占用情况。

4.关于变量 对于没有初始化(赋予变量初值)的全局变量,程序启动时自动将其全部初始化为 0(即变量的每个比特都是 0)。 不过好像在某些特殊情况下,bool类型初值可能会产生1? 对于局部变量,如果不进行初始化,那么它的初始值是随机的。

5.关于友元函数 friend 类型名 友元函数名(形参表); 在类体外对友元函数进行定义,定义的格式和普通函数相同,但可以通过“对象”作为参数直接访问对象的“私有成员”! 注意友元函数不是类的成员函数,所以友元函数的实现和普通函数一样,在实现时不用"::"指示属于哪个类,只有成员函数才使用"::"作用域符号; 友元函数不能直接访问类的成员,只能访问对象成员。友元函数可以访问对象的私有成员,但普通函数不行;(这里可能需要测试一些) 调用友元函数时,在实际参数中需要指出要访问的对象。类与类之间的友元关系不能继承。 一个类的成员函数也可以作为另一个类的友元,但必须先定义这个类。

6.关于建对象和调用构造函数 Peak obj(a,b,c);的作用等同于Peak obj=Peak(a,b,c); 但这种Peak obj=new Peak(a,b,c);的类似于Java的对象构造语法,对于关键字new会报错。

7.关于一个报错 vector不是模板,但是已经引用了vector库,造成这个报错的原因是没有using namespace

8.关于C++以及Matlab运算过程中,浮点数精度的问题会造成的问题 这类问题往往存在于浮点数的大小比较的操作过程,即>,<,和== 由于2进制的计算机,无法完美标识一些浮点数,只能采用近似值, 这个近似值会造成一些不可理喻的误差,例如7.2-5.0<8.3-6.1,但对于常用10进制的我们来说,式子两侧是相等的,都是2.2 目前来说,规避这类问题的方式主要有三种: 1.乘上10000,转int去比较,但遇到0.1变成0.099999,依然会产生误差 2.用一个叫round的函数,四舍五入 3.截取前n位,转字符作比较 4.使用e进行试探性补位,补差 5.限定可接受的范围差,例如:当,2进制较大值-2进制较小值=差值<万分之一(或者更小的范围时),认为两者相等

9.在C++中,也有集合型容器set<Type> 使用set需要引用头文件<set> 在set中每个元素的值都唯一,而且系统能根据元素的值自动进行排序。 但是set中数元素的值不能直接被改变。


最新回复(0)