关于C++的那些事儿(三)

交换两个数

 if (M < N) {
        M += N;
        N = M - N;
        M = M - N;
    }

第14章

C++ STL string类
C++ STL 向量模板
1. end函数返回一个迭代器,它指向最后一个元素之后的一个位置,而不是最后一个元素本身。

iter != ilist.end();//判断条件
  1. 为驳回编译器自动提供的机能,可将相应的成员函数声明为private并且不予实现。
  2. 复制构造函数在需要复制类对象的时候被调用,这些调用情况可以总结为:

    • 根据一个同类型的对象显示或隐式地初始化一个对象。当定义一个新对象并用一个同类型的对象对它进行初始化的时候,将显式使用复制构造函数,如:当将该类型的对象传递给函数或从函数返回该类型的对象时,将隐式地调用复制构造函数。

    • 作为值传递的实参传递给一个函数。

    • 函数返回时复制一个对象。
    • 初始化顺序容器中的元素。
  3. const_cast绝对不是为了改变const变量的值而设计的!
    在函数参数的传递上const_cast的作用才显现出来。

  4. inline函数的优缺点分析

通过下面这些优缺点总结你大概会更理解为什么要使用inline函数:

优点:

  • 它通过避免函数调用所带来的开销来提高你程序的运行速度。
  • 当函数调用发生时,它节省了变量弹栈、压栈的开销。
  • 它避免了一个函数执行完返回原现场的开销。
  • 通过将函数声明为内联,你可以把函数定义放在头文件内。

缺点:

  • 因为代码的扩展,内联函数增大了可执行程序的体积。
  • C++内联函数的展开是中编译阶段,这就意味着如果你的内联函数发生了改动,那么就需要重新编译代码。
  • 当你把内联函数放在头文件中时,它将会使你的头文件信息变多,不过头文件的使用者不用在意这些。

- 有时候内联函数并不受到青睐,比如在嵌入式系统中,嵌入式系统的存储约束可能不允许体积很大的可执行程序。

什么时候该使用内联函数

当程序设计需要时,每个函数都可以声明为inline。下面列举一些有用的建议:

  • 当对程序执行性能有要求时,那么就使用内联函数吧。
  • 当你想宏定义一个函数时,那就果断使用内联函数吧。
  • 在类内部定义的函数会默认声明为inline函数,这有利于 类实现细节的隐藏。

关键点

  • 内联声明只是一种对编译器的建议,编译器是否采用内联措施由编译器自己来决定。甚至在汇编阶段或链接阶段,一些没有inline声明的函数编译器也会将它内联展开。
  • 编译器的内联看起来就像是代码的复制与粘贴,这与预处理宏是很不同的:宏是强制的内联展开,可能将会污染所有的命名空间与代码,将为程序的调试带来困难。
  • 所有中类中定义的函数都默认声明为inline函数,所有我们不用显示地去声明inline。
    虚函数不允许内联。
  • 虽然说模板函数放中头文件中,但它们不一定是内联的。(不是说定义在头文件中的函数都是内联函数)。

    1. Primer中也有提到:“如果类包含内置或复合类型的成员,则该类不应该依赖于合成的默认构造函数“。
    2. B test (A()); 这句话,因为它有两种理解方式:
  • test 是个B类型的对象。 它使用A对象进行初始化。

  • test 是个返回值为B类型对象的函数,它有个类型为A的参数。

我们代码的意图是test是个对象,然而我的VS却把它理解成一个函数,并且告诉我:

error C2228: “.getNum”的左边必须有类/结构/联合

解决的办法就是使用C++11 提供的万能初始化钥匙(统一的初始化语法):

B test{A()};

回过头来看看发生歧义的原因:

  • C/C++中函数声明与定义是可以分开的。函数使用前声明就行。
  • 函数声明可以放在函数中。
  • C++函数声明的时候,形参可以只有类型而没有名称。
  • C++函数声明的参数名在类型后面可以加上(),如void max (int ( ),int ( ))

    1. 最小公倍数 = 两数乘积 / 最大公约数(辗转相除)
    2. 编写二分查找的程序时
  • 如果令 left <= right,则right = middle - 1;

  • 如果令left < right,则 right = middle;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值