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

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中数元素的值不能直接被改变。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值