内联函数:C++为提高程序运行速度所做的一项改进。

  • 常规函数和内联函数的区别在于:C++编译器如何将它们组合到程序中。源程序编译得到可执行程序——由一组机器语言指令组成。运行程序时,OS将这些指令载入到计算机内存中,因此每条指令都有特定的内存地址。
  • 常规函数调用:执行到函数调用指令时,程序将在函数调用后立即存储该指令的内存地址,并将函数参数复制到堆栈(为此保留的内存块),跳到标记函数起点的内存单元,执行函数代码(也许还需要将返回值放入到寄存器),然后跳回到地址被保存的指令处。
  • 内联函数调用:调用内联函数时,编译器将使用相应的函数代码替换函数调用。对于内联代码,程序无需跳到另一个位置处执行代码,再跳回来。因此,内联函数的运行速度比常规函数稍快,但代价是需要占用更多内存。
  • 内联函数必须在函数声明前函数定义前加上关键字inline。通常的做法是省略原型,将整个定义放在本应提供原型的地方。
  • 编译器一般不内联包含循环、递归、switch等复杂操作的内联函数;在类声明中定义的函数,除了虚函数的其他函数都会隐式地当成内联函数。虚函数可以是内联函数,但是当虚函数表现为多态性的时候不能内联。因为编译器无法知道运行期调用哪个代码。

友元:友元函数、友元类、友元成员函数

  • 友元函数:有一类特殊的非成员函数可以访问类的私有成员,它们被称为友元函数。其访问权限与成员函数相同。
  • 创建友元:1、将其原型放在类声明中,并在原型声明前加上关键字friend;2、编写函数定义,因为它不是成员函数,所以不要使用类::限定符。此外,不要在定义中使用关键字friend。

关键字:

  • this指针:1、隐含于每一个非静态成员函数中的特殊指针,它指向调用该成员函数的那个对象;2、当一个对象调用成员函数时,编译程序先将对象的地址赋给this指针,然后调用成员函数,每次成员函数存取数据成员时,都隐式使用this指针;3、当一个成员函数被调用时,自动向它传递一个隐含的参数,该参数是一个指向这个成员函数所在对象的指针;4、this是个右值,所以不能取得this的地址。
  • assert()  断言,是宏而非函数。assert()宏的原型定义在<assert.h>(C)、<cassert>(C++)中,其作用是如果条件返回错误,则终止程序执行。可以通过定义NDEBUG来关闭assert,但是需要在源代码的开头,include<cassert>之前。
  • sizeof()对数组,得到整个数组所占空间的大小;对指针,得到指针本身所占空间的大小。
  • #pragma pack(n) 设定结构体、联合以及类成员变量以n字节方式对齐。

C++中的struct和class:

  • struct更适合看成是一个数据结构的实现体;class跟适合看成是一个对象的实现体。
  • 区别:struct默认访问控制是public的,而class默认的成员变量访问控制是private的。

using编译指令的使用:理念:只让需要访问名称空间std的函数访问它是更好的选择。

  1. (using编译指令)将using namespace std;放在函数定义之前,让文件中所有函数都能使用名称空间std中所有元素;
  2. (using编译指令)将using namespace std;放在特定函数定义中,让该函数能够使用名称空间std中的所有元素;
  3. (using声明)在特定函数中使用类似using std::cout;这样的编译指令,让该函数使用指定的元素,如cout;
  4. (作用域解析运算符)完全不使用编译指令using,而在需要使用名称空间std中的元素时,使用前缀std::,如:std::cout<<"Haha"<<std::endl;
  5. using声明:一次只引入名称空间的一个成员; using指令:使得某个特定名称空间中所有名字都可见。

尽量少使用using编译指令污染名称空间,多使用using声明:

#include <iostream>

using namespace std;

namespace jill{  int a;  }

using jill::a;                                 #2

using namespace jill;                 #4

int main(int argc, char *argv[]){

using jill::a;                           #1

using namespace jill;           #3

int a=3;

cout<<a<<endl;

return 0;

}

#1  using声明:导入名称空间中特定成员,相当于在本区域内定义变量,如果该成员与局部成员变量发生冲突,编译器将发出指示;

#2  using声明:导入名称空间中特定成员,相当于在本区域内定义变量,因为其声明在函数外,固不会产生变量名冲突,局部名称a将覆盖上面的全局a;

#3、4  using编译指令:导入名称空间中的所有成员。如果与局部名称发生冲突,则局部名称将覆盖名称空间版本,而编译器不会发出警告。

名称空间:

  • 传统的C++名称空间:
  1. 声明区域:可以在其中进行声明的区域。全局变量的声明区域为其所在的文件;局部变量的声明区域为其所在的代码块。
  2. 潜在作用域:变量的潜在作用域从声明点开始,到其声明区域的结尾。因此潜在作用域比声明区域小,这是由于变量必须定义后才能使用。
  3. 然而,变量并非在其潜在作用域内的任何位置都是可见的。如:它可能被一个在嵌套声明区域中声明的同名变量隐藏。例如,在函数中声明的局部变量将隐藏在同一个文件中声明的同名全局变量。
  4. 作用域:变量对程序而言可见的范围被称为作用域。
  • C++新的名称空间特性:
  1. 通过定义一种新的声明区域来创建命名的名称空间。如此,一个名称空间中的名称不会与另一个名称空间的相同名称发生冲突,同时允许程序的其他部分使用该名称空间中声明的东西。
  2. 名称空间可以是全局的也可以位于另一个名称空间中,但不能位于代码块中。
  3. 除用户定义的名称空间外,还有全局名称空间——它对应于文件级声明区域,固全局变量被描述为位于全局名称空间中。
  4. 通过作用域解析运算符::来访问给定名称空间中的名称。namespace Jack{ double pail;...};  Jack::pail=12.34;

作用域解析运算符(::):

  1. 全局作用域符(::name):用于类型名称(类、类成员、成员函数、变量等)前,表示作用域为全局命名空间;
  2. 类作用域符(class::name):用于表示指定类型的作用域范围是具体某个类的;
  3. 名称空间作用域符(namespace::name):用于表示指定类型的作用域范围是某个具体名称空间的。

C++内联函数、友元函数、名称空间相关推荐

  1. 函数对象,名称空间与作用域,闭包,装饰器

    函数是第一类对象即可以被当做数据取使用 #1 可以被引用 #2 可以当作参数传递 #3 返回值可以是函数 #3 可以当作容器类型的元素 1.可以被引用 先看变量可以怎么玩 age=18 x=age 把 ...

  2. python 函数可以作为容器对象的元素_python第十二天, 三元表达式, 函数对象,名称空间与作用域,函数的嵌套定义...

    复习 1. 字符串的比较: 2. 函数的参数:形参与实参 3. 实参的分类:位置实参与关键字实参 4. 形参分类: 1.无值位置形参 2.有值位置形参 3.可变长位置形参 4.有无值关键字形参 5.可 ...

  3. python中嵌套函数的应用实例-实例详解python函数的对象、函数嵌套、名称空间和作用域...

    函数的对象 python中一切皆对象 函数对象的四大功能 引用 def f1(): print("from f1") f1() #调用函数 print(f1) print(&quo ...

  4. Python函数基础3 函数对象、名称空间、装饰器

    今日内容 1.函数对象 2.名称空间与作用域 3.函数的嵌套调用与闭包 4.装饰器 一.函数对象 1.1 定义 函数名存放的就是函数地址,所以函数名也就是对象,称之为函数对象 1.2 函数对象的应用 ...

  5. 二刷python:函数作用域与名称空间

    #函数作用域与名称空间 ##初识函数对象 函数非常非常非常重要.但是不要过于的去害怕他.弄清楚本质就行 函数 --> 更高级一点的数据容器,里面存的不是单纯数据,而是代码!!! 一个容器能干嘛, ...

  6. 【C++ 语言】面向对象 ( 成员函数 | 常量函数 | 友元函数 | 友元类 | 单例类 )

    文章目录 成员函数 常量函数 友元函数 new 创建对象 友元类 单例类 成员函数 此处继续上一篇博客继续向后讲解C++面向对象 类成员方法 , 除了定义构造方法与析构方法之外 , 还可以定义普通的成 ...

  7. 如何删除内联块元素之间的空间?

    鉴于此HTML和CSS: span { display:inline-block; width:100px; background-color:palevioletred; } <p> & ...

  8. 【Kotlin】apply 内联扩展函数 ( apply 函数原型 | apply 函数示例 | Kotlin 调用 Java API )

    文章目录 I . 内联扩展函数 apply II . Kotlin 调用 Java API III . apply 内联扩展函数示例 ( 调用 Java API 处理图像 ) I . 内联扩展函数 a ...

  9. 可变长参数,函数的嵌套,名称空间,关键字

    5.30自我总结 一.可变长参数 1.可变长形参之(*) 形参中的会将溢出的位置实参全部接收,然后存储元组的形式,然后把元组赋值给后的参数.需要注意的是:*后的参数名约定俗成为args. def su ...

  10. 3-V2-类和对象 -- const内联 静态成员 友元

    const修饰成员函数 在成员函数后面加一个const, const修饰this指针指向的对象, 保证调用这个const成员函数的对象在函数内不会被改变 注意:成员函数如果不修改成员变量,则加上con ...

最新文章

  1. 华为秋招_多数组合并问题
  2. RDKit | 化合物描述符向量化及部分结构检索
  3. 阿里达摩院再造AI抗疫技术:20秒判读CT影像,识别准确率达96%
  4. php mysql table_关于php:MySQL Table不存在错误,但确实存在
  5. JAVA按键关闭窗口csdn_JSP_卖jsp编程技巧的那个垃圾的所有实例的答案全部已收集,现将他人收集的实例答案公布出来,大家鉴赏!,1. 如何让选中的一行记录高亮 - phpStudy...
  6. 数据库元数据数据字典查询_4_列出给定表的索引信息
  7. 《C++ Primer》13.1.6节练习(部分)
  8. 小程序mpvue图片绘制水印_开发笔记:使用 mpvue 开发斗图小程序
  9. typescript 学习
  10. MPEG4 笔记3(TRAK,TKHD, MVHD)
  11. 百度干净云(无广告不限速的绿色百度云客户端)
  12. VC网络编程实战视频教程
  13. 80386 保护模式
  14. 加权平均数的例子_EXCEL 加权平均数的计算
  15. 网站服务器域名费用入什么科目,企业域名服务费记什么科目
  16. (论文)Persuading Customers to Buy Early: The Value of Personalized
  17. ROS机器人(一) -- 环境搭建
  18. [php fqm说明]以及nginx和apache的一些说明
  19. 修饰数码相机图像以便用于 CMYK 打印作业
  20. Java实现word文档转换为pdf,jodconverter

热门文章

  1. linux安装usermod命令,Linux中的Usermod命令
  2. 智能医疗和互联网医疗
  3. MIPS流水线 流水线的冒险
  4. 发现孩子用计算机,了解儿童用脑特点后发现:拥有一个高机能的计算机式头脑原来不难!...
  5. Janis 4K闭循环低温恒温器
  6. python编程从入门到实践,第七章练习题
  7. chatgpt帮助你完成五个工作,提高效率
  8. 第三方JavaScript的用法
  9. PDF电子签名A4实现
  10. Functional Programming for the Rest of Us 函数式编程另类指南