目录

目录

前言

C++和C语言的不同

・文件后缀

・C语言是面向过程编程,C++则是面向对象编程

・头文件

・新增命名空间

・输入输出

补充:输入时需要注意的

・新的数据类型

补充:关于C++中的const

・空指针的声明

・函数思想

参考资料:


前言

学习C++之前 建议先学习C语言的知识。因为C++看似很多功能,都是用C语言来实现的。

熟练C语言之后对C++的学习有很大助力,并且某些硬件比如 Arduion 也是由C语言进行控制的。

作为计算机专业的学生,在大一开始也是从C语言入门的。但是学校并没有C++的课程。

想系统学习C++的我,机缘巧合之下报了顿开教育的C++全栈课程。没想到也是由C语言先开始教学,再进入C++。

C++和C语言的不同

学习C++之前,先了解一下C++与C语言的不同之处。

・文件后缀

C语言源文件的后缀为.c,C++源文件的后缀为.cpp

・C语言是面向过程编程,C++则是面向对象编程

・头文件

1.包含自己的头文件时不变

#include "xxx.h"

2.包含C语言标准库时的两种方法

#include <stdio.h>  保持原来方法不变
#include <cstdio>  去掉“.h ”在最前加上“c”

3.包含C++标准库时不需要“.h”

#include <iostream>  C++标准输入输出头文件(Input/Output Stream)

・新增命名空间

在C语言中同一个作用域下不允许定义相同标识符(变量名,函数名等)

而C++中引入了命名空间之后可以重复使用同一标识符,从而增加了标识符的使用率

#include <stdio.h>基本创建空间方法
namespace NameList1{int varA=1;void print(){printf("variable in NameList1:%d\n",varA);}
}namespace NameList2{int varA=1;void print(){printf("variable in NameList2:%d\n",varA);}}

通过上面的代码就可以通过不同的空间创建拥有相同名字的变量和函数了(叫空间中的成员或空间中的数据)

并且可以通过作用域分辨符“::”来使用他们

#include <stdio.h>//基本创建空间方法
namespace NameList1 {int varA;void print() {printf("variable in NameList1:%d\n", varA);}
}namespace NameList2 {int varA=2;void print() {printf("variable in NameList2:%d\n", varA);}}int main() {NameList1::varA = 1;NameList1::print();NameList2::print();return 0;
}

 输出:

variable in NameList1:1
variable in NameList2:2

如此可见,名字虽然相同,但是所在的空间不同。可以通过 作用域分辨符“::”来区分并访问它们。

而作用域分辨符“::”还有另一个作用就是可以区分全局变量。

#include <stdio.h>int Var = 2;int main() {int Var = 1;printf("%d\n", Var);printf("%d\n",::Var);return 0;
}

 输出:

1

2

并且可以知道,在没有作用域分辨符“::”的时候,输出变量时采用就近原则。

另外,可以通过“using namespace”来指定某个空间名从而省略使用作用域分辨符

...
int main() {using namespace NameList1;printf("%d\n", varA);return 0;
}

但是使用两次 “using namespace”来指定两个不同空间名时会出现二义性问题,导致程序报错。

因为“using namespace”的作用域为此代码开始到所在函数结束,并不会被第二个“using namespace”断开。

错误代码:

...
int main() {using namespace NameList1;printf("%d\n", varA);using namespace NameList2;printf("%d\n", varA);return 0;
}
错误代码

此时需要用 作用域分辨符“::” 来进行区分来避免二义性

正确代码:

...
int main() {using namespace NameList1;printf("%d\n", varA);printf("%d\n", NameList2::varA);return 0;
}
正确代码

此外,命名规则还能进行嵌套(剥洋葱)

...
namespace A {int aa = 10;namespace B {int bb = 100;}
}int main() {printf("%d\n", A::aa);printf("%d\n", A::B::bb);using namespace A::B;printf("%d\n", bb);using namespace A;printf("%d\n", aa);printf("%d\n", B::bb);printf("%d\n", bb);return 0;
}

 输出:

10
100
100
10
100
100

・输入输出

使用<iostream>库,cout进行输出,cin进行输入,使用位运算符“<<” ”>>”进行连接,不需要像C语言那样输入格式指定字符。

而需要强制类型转换时只需在变量名前加上括号或者给变量名加上括号进行。

"ednl" 用来进行换行

#include <iostream>int main(){using namespace std;cout << "ILoveyou\n";char str[] = "ILoveyou\n";cout << str;int a = 1;float b = 1.1;cout << a;cout << b;cout << "\n";cout << a << "\t" << (int)b << "\n";cout << a << "\t" << int(b) << "\n";//即使是输入用变量也要有初始化的习惯int iNum = 0;float fNum = 0.0f;//unsigned int uNum = 1u;//long int lNum = 1L;cout << "请输入一个整数,一个浮点数,一个字符串:";cin >> iNum >> fNum >> str;cout << iNum << "\t" << fNum << "\t" << str << endl;return 0;
}

在开头一遍会输入“using namespace std” ,因为cout 和 cin 在常用库内的命名空间std里有定义。

如果不使用,则需要 std::cout 和 std::cin 来访问

补充:输入时需要注意的

c++的“cin”和c的“sacnf”一样,会判断输入缓存区中是否有空格,空格为输入数据读取的结束。

接受空格的输入:

char str[10]="";
//C
gets_s(str,10);//C++
cin.getline(str,10);
cout.write(str,10);

另外缓冲区可以通过

while(getchar()!=\n);

来清除

・新的数据类型

bool类型:占用一个字节

非零表示成立,0或者指针空表示不成立

#include <iostream>
using namespace std;
void  testBool()
{bool bNum = 1234;cout << bNum << endl;bNum = -1;cout << bNum << endl;bNum = false;cout << bNum << endl;bNum = true;cout << bNum << endl;//boolalpha 用true和false方式打印bool类型cout << boolalpha << bNum << endl;
}

  输出:

1
1
0
1
true

引用类型:给变量起别名,可以通过别名直接调用原变量

...
int main() {int A = 1;int B = 2;int& quoteA = A;int& quoteB = B;cout << quoteA << quoteB << endl;
}

常见用法,两数交换时可以不用像麻烦的指针那样进行操作,形参变成了实参,可以直接对其进行更改

...
void swap(int& quoteA, int& quoteB) {int c = quoteA;quoteA = quoteB;quoteB = c;
}int main() {int A = 1;int B = 2;cout << A << B << endl;swap(A, B);cout << A << B << endl;
}

输出:

12

21

常引用:需要const修饰,引用时无法通过别名对被引用对象进行修改

右值引用: 提供一个修改常量的接口(例如输入本金得到利息的计算结果)

...
void printRightValue(int&& a){a+=11;cout<<a<<endl;
}int main(){printRightValue(11);return 0;
}

常引用和右值引用的区别:右值引用不能给左值起别名

int aa=1;const int& x=aa;
int&& xx=aa;//错误

引用的用处

函数参数(防止拷贝产生)

函数返回值(增加左值使用),一般返回全局变量的引用,无法返回局部变量

 auto类型:根据赋值的数据,自动推断其类型(需要赋值)

与C语言auto的区别:在C++中淘汰了C语言的用法,只有自动推断用法

补充:关于C++中的const

字符串常量传递给函数时,形参必须用const修饰

常量起别名时需要const来修饰

・空指针的声明

nullptr 而不是 NULL,其实都可以,但是建议用nullptr

int* p = nullptr;
char* pc = NULL;

・函数思想

内联函数:

        inline,短小精悍的函数可以为内联函数

inline int Max(int a,int b){return a>b ? a : b;
}

在结构体中或者类中实现的函数默认内联

函数重载:

C++允许同名不同参数函数存在

不同参数的定义:参数数目不同,参数类型不同,参数顺序不同(前提类型不同)

void print(int a) //算
{cout << a << endl;
}void print(int a, int b) //算
{cout << a + b << endl;
}void print(int b, int a) //不算
{cout << a + b << endl;
}void print(int a, char b)  //算
{cout << "int,char" << endl;cout << a + b << endl;
}void print(char a, int b) //算
{cout << a + b << endl;
}

重载优先调用类型一致的函数,若没有则优先左边参数匹配

...
void print(char a, int b);
void print(int a, int b);int main() {print(1,'A');return 0;
}void print(int a, int b)
{cout << a + b << endl;
}void print(char a, int b)
{cout << "char,int" << endl;cout << a + b << endl;
}

输出: 

 66

函数缺省:(重载的综合写法)

C++中允许给函数形参初始化

缺省顺序 必须从右往左缺省,缺省的参数中间不能存在没有缺省的

没有传入参数,使用的是默认值

传入参数必须从左往右满足

...
void printData(int a=1, int b=2, int c=3, int d=4)
{cout << a + b + c + d << endl;
}int main()
{printData();             //a=1 b=2 c=3 d=4printData(10);             //a=10 b=2 c=3 d=4printData(10, 20);        //a=10 b=20 c=3 d=4printData(10, 20, 30);   //a=10 b=20 c=30 d=4  printData(10, 20, 30, 40);//a=10 b=20 c=3 d=40return 0;
}

输出: 

10
19
37
64
100

疑惑点:

常引用的本质是什么

参考资料:

基于 顿开教育 莫影老师 C++课程第一课 笔记整理

C++ 从入门到入土 #1相关推荐

  1. rocketmq怎么保证消息一致性_从入门到入土(三)RocketMQ 怎么保证的消息不丢失?...

    精彩推荐 一百期Java面试题汇总SpringBoot内容聚合IntelliJ IDEA内容聚合Mybatis内容聚合 接上一篇:RocketMQ入门到入土(二)事务消息&顺序消息 面试官常常 ...

  2. Activiti工作流从入门到入土:完整Hello World大比拼(Activiti工作流 API结合实例讲解)

    文章源码托管:https://github.com/OUYANGSIHAI/Activiti-learninig 欢迎 star !!! 本来想着闲来无事,前面在项目中刚刚用到了工作流 Activit ...

  3. activiti api文档_【白银人机】Activiti 工作流从入门到入土:完整 hello world 大比拼(API 结合实例讲解)...

    点击上方"好好学java",选择"置顶"公众号 重磅资源.干货,第一时间送达 重磅推荐  ① 纯福利 | 公众号资源大汇总,一年才一次! ② 重磅!!2018年 ...

  4. 从入门到入土(十)RocketMQ集群流程以及核心概念

    精彩推荐 一百期Java面试题汇总 SpringBoot内容聚合 IntelliJ IDEA内容聚合 Mybatis内容聚合 接上一篇:从入门到入土(九)手摸手教你搭建RocketMQ双主双从同步集群 ...

  5. 从入门到入土(九)手摸手教你搭建RocketMQ双主双从同步集群,不信学不会!...

    精彩推荐 一百期Java面试题汇总 SpringBoot内容聚合 IntelliJ IDEA内容聚合 Mybatis内容聚合 接上一篇:从入门到入土(八)RocketMQ的Consumer是如何做的负 ...

  6. 从入门到入土(八)RocketMQ的Consumer是如何做的负载均衡的

    精彩推荐 一百期Java面试题汇总 SpringBoot内容聚合 IntelliJ IDEA内容聚合 Mybatis内容聚合 接上一篇:RocketMQ入门到入土(七 )为什么同一个消费组设置不同ta ...

  7. RocketMQ入门到入土(七 )为什么同一个消费组设置不同tag会出现奇怪现象

    精彩推荐 一百期Java面试题汇总 SpringBoot内容聚合 IntelliJ IDEA内容聚合 Mybatis内容聚合 接上一篇:RocketMQ入门到入土(六)发消息的时候选择queue的算法 ...

  8. RocketMQ入门到入土(六)发消息的时候选择queue的算法有哪些?

    精彩推荐 一百期Java面试题汇总 SpringBoot内容聚合 IntelliJ IDEA内容聚合 Mybatis内容聚合 接上一篇:RocketMQ入门到入土(五)消息持久化存储源码解析 一.说明 ...

  9. RocketMQ入门到入土(五)消息持久化存储源码解析

    精彩推荐 一百期Java面试题汇总 SpringBoot内容聚合 IntelliJ IDEA内容聚合 Mybatis内容聚合 接上一篇:RocketMQ入门到入土(四)producer生产消息源码剖析 ...

  10. RocketMQ入门到入土(四)producer生产消息源码剖析

    精彩推荐 一百期Java面试题汇总 SpringBoot内容聚合 IntelliJ IDEA内容聚合 Mybatis内容聚合 接上一篇:从入门到入土(三)RocketMQ 怎么保证的消息不丢失? 篇幅 ...

最新文章

  1. CVPR2021 图像匹配挑战赛,双赛道冠亚军方案
  2. 在 libevent 中使用 MariaDB(MySQL)
  3. 2.4带通采样的实际问题
  4. hdu2063 二分图(基础题)
  5. 一台路由器实现电信ITV与宽带共享上网
  6. 杭电60题--part 1 HDU1003 Max Sum(DP 动态规划)
  7. 人工智能python小程序_Python:一个可以套路别人的python小程序
  8. html百度地图秘钥,自己网页调用百度地图API 附API密钥
  9. 使用git软件上传文件到自己的github当中去
  10. GHOST还原提示“A:\GHOSTERR.TXT”解决方案
  11. html5图标返回首页超链接,ppt超链接返回按钮怎么设置
  12. 高效非支配排序ENS python版
  13. 世界杯最野蛮大战,巴西付出慘重代价步入四强
  14. 怎样免费将多个pdf文件合并为一个
  15. 第十三课、类族的结构进化-------------------狄泰软件学院
  16. elliptic-curve签名验证verify signature in EdDSA
  17. LT9211芯片资料分享
  18. php比价源码,定稿毕业论文基于PHP的家电在线比价系统设计与实现喜欢就下吧(资料4)...
  19. 1063 计算谱半径(JAVA)
  20. UVa816 例题 6-14 Abbott的复仇 (Abbott's Revenge,ACM/ICPC World Finals 2000)

热门文章

  1. 群晖docker下载失败_群晖通过Docker安装图床工具Chevereto的步骤
  2. XSS 平台搭建与优化(基于 xsser.me 源码)
  3. 枚举中文转数字并easyexcel导入(读取Read)数据至数据库,用监听器解决导入关联多表的问题
  4. LICEcap GIF屏幕录制工具
  5. 2019年度中职组“网络空间安全”赛项赣州市竞赛任务书B卷
  6. 45 《定位》 -豆瓣评分8.3
  7. Android页面左右滑动浏览图片(Gallery示例)
  8. Samtec技术前沿 | 信号发生器 - 可靠性的关键所在
  9. Spring请求与响应——响应
  10. Vlayout使用详细介绍 1