来源:微信公众号「编程学习基地」

C到C++II

  • 结构,联合,枚举
    • C++结构体
    • C++联合
    • C++枚举
  • bool类型
  • 内联
  • 重载
  • 缺省参数和哑元
  • 哑元
  • 引用
    • 引用特点
    • 引用做参数
    • 引用做函数返回值

结构,联合,枚举

C++结构体

声明或定义结构体变量时可以省略struct,内部可以定义函数

#include<iostream>
struct STU{int m_age;char m_name[20];void introduce(){std::cout << "我叫" << m_name << ",今年" << m_age << "岁" << std::endl;}
};int main(){//C必须加上struct关键字才能定义变量,除非给结构体取别名STU stu = { 18,"小明" };stu.introduce();   //调用结构体里面的函数return 0;
}
C++联合

声明或定义联合变量,可以省略union 支持匿名联合

//匿名联合示例 匿名联合不能作为全局,只能放在函数里面
#include<iostream>
int main(){union{char c;int i;};i = 65;std::cout << c << std::endl;return 0;
}
//打印结果
A
C++枚举

声明或定义枚举变量,可以省略enum 独立类型和整型不能隐式相互转换

//枚举类型检查更为严格
enum Color{RED, GREEN,BLUE
};
int main(){Color color;//在C中枚举类型可以隐式转换成整型//color = 1;  //不允许 会报错不能将 "int" 类型的值分配到 "Color" 类型的实体color = RED;   //类型检查更为严格return 0;
}

bool类型

true 表示真 即单字节整数1

false 表示假 即单子接整数0

任何基本类型都可以隐式转换为布尔类型,遵循原则:非0即真,0即假

#include<iostream>
//using namespace std;
int main(){bool flag = false;std::cout << flag << std::endl;flag = true;std::cout << flag << std::endl;//boolalpha        打印true/false    命名空间std里面的函数//noboolalpha   bool 打印字面值 0/1std::cout << std::boolalpha << flag << std::endl;std::cout << std::noboolalpha << flag << std::endl;return 0;
}
//打印结果
0
1
true
1

内联

用函数已被编译好的二进制代码,替换对该函数的调用指令。提高效率,避免函数调用开销

使用inline关键字期望该函数被优化为内联,是否内联由编译器决定,看你系统的心情决定是否优化。内联会使可执行文件内存变大,只有频繁调用的简单函数适合内联。复杂函数和递归函数都不适合内联。

//内联形式:函数前面加上inline关键字
inline int max(int a,int b){return a > b ? a : b;
}

重载

同一作用域中,函数名相同,参数表不同的函数,构成重载

#include<iostream>
using namespace std;
//原函数
void foo(int a)   {cout << "foo(int)" << endl;
}
//重载函数1 参数类型不同
void foo(char a)  {cout << "foo(char)" << endl;
}
//重载函数2 参数数量不同
void foo(int a, double b)  {cout << "foo(int,double)" << endl;
}
//重载函数3 参数顺序不同
void foo(double a, int b)  {cout << "foo(double,int)" << endl;
}
//不构成重载 重载与返回类型无关
//int foo(double a, int b){//  cout << "foo(double,int)" << endl;
//}
int main(){foo(1);foo('a');foo(1, 1.314);foo(1.314, 1);return 0;
}
//打印结果
foo(int)
foo(char)
foo(int,double)
foo(double,int)

重载是通过C++编译器 函数改名实现的

怎么证明!在linux下 用gcc -c 获取.o文件 使用nm .o文件 查看

//main.cpp文件
void fun(){}
void fun(int a,int b){}
void fun(char a,char b){}

我的Linux不知道装什么东西挂了,就用windows下的PowerShell演示一下,开始菜单下W开头找到Windows PowerShell,输入下面命令(好像要配置gcc,可以在Linux下试验)

Windows PowerShell
版权所有 (C) Microsoft Corporation。保留所有权利。PS D:\测试> dir目录: D:\测试Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----        2020/1/27     20:20             64 main.cppPS D:\测试> g++ -c .\main.cpp
PS D:\测试> dir目录: D:\测试Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----        2020/1/27     20:20             64 main.cpp
-a----        2020/1/30      0:14            852 main.oPS D:\测试> nm .\main.o
0000000000000000 b .bss
0000000000000000 d .data
0000000000000000 p .pdata
0000000000000000 r .rdata$zzz
0000000000000000 t .text
0000000000000000 r .xdata
000000000000000f T _Z3funcc
0000000000000002 T _Z3funii
0000000000000000 T _Z3funv
PS D:\测试>

前面的不用看,看最后三行

000000000000000f T _Z3funcc
0000000000000002 T _Z3funii
0000000000000000 T _Z3funv
前面一串数字代表地址 T代表函数 _Z代表标志符
3代表函数名字长度(fun) cc代表两个char
ii代表两个int v代表void

缺省参数和哑元

为函数指定缺省值,调用时若未指定实参,则对应的形参取缺省值

  • 缺省参数只能在最后,即你某个参数指定为缺省参数,后面所有参数都要有缺省值
  • 最好在函数声明中指定缺省参数,这样可以利用声明改缺省值。
#include<iostream>
using namespace std;
void fun(int a = 10, int b = 20);
int main(){fun();//利用声明改缺省值void fun(int a = 2, int b = 5);fun();return 0;
}
void fun(int a /*=10*/, int b /*= 20*/){cout << a << "," << b << endl;
}
//打印结果
10,20
2,5

哑元

只指定类型而不指定名称的函数参数,叫做哑元

#include<iostream>
using namespace std;
void fun(int, int){cout << "哑元 占着茅坑不拉屎" << endl;
}
int main(){fun(1,2);return 0;
}

哑元有什么用呢!

  • 兼容之前版本
  • 形成函数重载

引用

引用是c++对c语言的重要扩充。引用就是某一变量(内存)的一个别名,对引用的操作与对变量直接操作完全一样。

格式:类型 &引用变量名 = 已定义过的变量名

引用特点
  • 引用就是变量的别名,一个变量可取多个别名
  • 引用必须初始化,不能为空
  • 引用只能在初始化的时候引用一次 ,不能更改为转而引用其他变量
#include<iostream>
using namespace std;
int main(){int num = 10,temp = 20;//int &NUM = NULL;     //引用必须初始化,不能为空int &NUM = num;   //此时对NUM的操作就是对num操作NUM = 100;cout << num << endl;//引用不能更换目标NUM=temp;  //此时不是改引用对象,而是赋值//引用变量和被引用的变量虽然是同一个变量,但是可以被不同修饰符修饰const int& const_num = num;//const_num = 20;  //不允许 错误:表达式必须为可修改的左值num = 20;cout << const_num << endl;return 0;
}

注意:被const修饰的变量被引用时必须被const修饰

 const int a = 10;const int& A = a;
引用做参数

节省空间+提高效率

在函数中,形参的值可以由

值传递 形参生成局部临时变量接收实参的值
引用传递 形参是实参的别名
指针传递 传入实参的地址,指针通过地址访问修改值
#include<iostream>
using namespace std;
//值传递
void fun1(int a){a++;
}
//指针传递
void fun2(int* pa){(*pa)++;
}
//引用传递
void fun3(int& ra){ra++;
}
int main(){int a = 10, b = 10, c = 10;fun1(a);cout << a << endl;fun2(&b);cout << b << endl;fun3(c);cout << c << endl;return 0;
}
//打印结果
10
11
11

引用的本质就是指针 用来代替指针,弱化版指针,没有指针灵活,安全性更高

引用做函数返回值
#include<iostream>
using namespace std;
//返回的是a的值
int fun1(int& a){return ++a;
}
//返回值做引用 返回是a的别名
int& fun2(int& a){return ++a;
}
int main(){int num = 10;//fun1(num) = 100;    //fun1返回的是一个值fun2(num) = 100;  //fun2返回的是一个变量cout << num << endl;return 0;
}

C++进阶学习(二)----C到C++II相关推荐

  1. linux mysql进阶_mysql进阶学习二之搭建主从

    前面说了主从复制的原理,现在我们搭建主从结构 1. 提前准备 我准备了两台主机,主节点是远程的centos7,从节点是本机windows 主从复制的原理在上一篇已经说了:主节点中mysql创建一个用户 ...

  2. 【Scheme】Scheme 编程学习 (二) —— 基础

    [Scheme]Scheme 编程学习 (二) -- 基础 文接前一节内容 : [Scheme]Scheme 编程学习(一) -- 概述 本文章可以跟视频课程一起看,做了一些补充说明 原视频地址: B ...

  3. Mysql进阶学习(二)条件查询

    Mysql进阶学习(二)条件查询 进阶2:条件查询 一.按条件表达式筛选 案例1:查询工资>12000的员工信息 案例2:查询部门编号不等于90号的员工名和部门编号 二.按逻辑表达式筛选 案例1 ...

  4. android java服务,Android进阶学习必会:Java Binder中的系统服务

    前言 这个知识点是Android进阶学习必须掌握的知识点之一,也是高阶Android架构师经常问到的点.在这里分想给大家,希望对大家的工作和学习有所帮助.喜欢本文的记得点赞关注哦~ 在前面的Andro ...

  5. Linux 进阶笔记(二)

    这几篇博文主要记录博主的Linux 学习之路,用作以后回顾和参考.大家可以选择略过也可以作参考. (一)Linux 初步笔记 (二)Linux 进阶笔记(一) (三)Linux 进阶笔记(二) (四) ...

  6. JQuery进阶学习

     JQuery进阶学习的内容         1. 动画         2. 遍历         3. 事件绑定         4. 案例         5. 插 一. 动画 三种方式显示和隐 ...

  7. UnrealEngine蓝图进阶学习笔记(六):按波次生成敌人

    UnrealEngine蓝图进阶学习笔记(六):按波次生成敌人 2020.04.03 一.创建敌人生成点及相关变量 1.部署生成点 左部面板搜索TargetPoint至场景(2250,0,0),ctr ...

  8. Java进阶学习-7 面向对象程序设计原则

    title: Java进阶学习-7 面向对象程序设计原则 date: 2020-02-02 18:02:27 tags: 以一个城堡游戏为例子谈面向对象程序设计原则 Game.java package ...

  9. SSM框架学习——Maven进阶学习

    her~~llo,我是你们的好朋友Lyle,是名梦想成为计算机大佬的男人! 博客是为了记录自我的学习历程,加强记忆方便复习,如有不足之处还望多多包涵!非常欢迎大家的批评指正. 今天我们进入新的学习环节 ...

  10. Tensorflow 进阶学习

    Tensorflow 进阶学习 学习一个GAN网络代码,在train函数中,出现了如下调用tf的函数: def train(self):update_ops = tf.get_collection(t ...

最新文章

  1. Centos6 破解系统密码
  2. selenium python自动化文件下载_selenium+python自动化79-文件下载(SendKeys)【转载】...
  3. oracle 更新丢失
  4. 在PHP中使用CURL,“撩”服务器只需几行——php curl详细解析和常见大坑
  5. Boost.Geometry 结合 Boost.Graph,计算最短路线
  6. Canvas学习:封装Canvas绘制基本图形API
  7. 为什么前端工程师的工作很难找?
  8. 树莓派、debian 下安装 phantomjs casperjs
  9. Atitit 理解Monad attilax总结Atiti
  10. php网站 视频马赛克,如何给视频加马赛克 菜鸟也能学会的视频加马赛克解决方案...
  11. python中跳过本次循环的语句是_Python跳过for循环
  12. 租车汽车租赁管理系统
  13. vue里面变量名前面加三个点代表什么意思?
  14. idea 断点线程_在IntelliJ IDEA中多线程并发代码的调试方法详解
  15. JWT springboot集成jWT
  16. 易基因 | 文献速递:RRBS方法绘制1538例乳腺癌甲基化图谱并预测癌症发生/预后
  17. 通过CURL请求示例详解HTTPS协议
  18. CDN - 阿里云CDN全站加速,说说动态加速那些事
  19. 《Real Time Rendering》第四章 图形变换
  20. 四小时测试你的Sql能力--- MySQL经典练习50题

热门文章

  1. ajax,HTTP原理 : 网络传输协议,网页从输入url到渲染的流程,函数防抖和节流
  2. NFC·(近距离无线通讯技术)
  3. 文章字数统计(python)
  4. 如何将D盘空间压缩并扩展C盘
  5. 2021-3-31 git提交代码的命令及流程
  6. 通信原理简明教程 | 基本概念
  7. 2010年显卡行业大事
  8. 《域渗透攻防指南》签名版预售来啦
  9. Excel-VBA应用(5):设计问卷及数据回收统计系统
  10. (转)活出生命的成就