『C++』我想学 C++,C++ 太难了,那我想入门,给我 10 分钟我带你入门
从第一个 CPP 开始写起:
"hello,world"
就是一条预处理命令, 它的作用是通知 C++编译系统在对 C++程序进行正式编译之前需做一些预处理工作,导入头文件下的函数,与类。
函数就是实现代码逻辑的一个小的单元。
必不可少之主函数
一个 C++程序有且只有一个主函数,即 main 函数。
C++程序就是执行主函数里的代码,也可以说这个主函数就是 C++中的唯一入口。
而 main 前面的 int 就是主函数的类型.
cout 是格式输出函数,这里就记住它的功能就是在屏幕上输出指定的信息
return 是函数的返回值,根据函数类型的不同,返回的值也是不同的。
endl 是一个函数模板,这里知道是用来换行的即可。
(注意:C++程序一定是从主函数开始执行的)
良好习惯之规范
一个说明或一个语句占一行,例如:包含头文件、一个可执行语句结束都需要换行。
函数体内的语句要有明显缩进,通常以按一下 Tab 键为一个缩进。
括号要成对写,如果需要删除的话也要成对删除。
当一句可执行语句结束的时候末尾需要有分号。
代码中所有符号均为英文半角符号。
程序解释——注释
注释是写给程序员看的,不是写给电脑看的。
C++注释方法有两种:
多行注释: / 注释内容 /
单行注释: //注释一行
有名有姓的 C(标识符)
C++规定,标识符可以是字母(A~Z,a~z)、数字(0~9)、下划线_组成的字符串,并且第一个字符必须是字母或下划线。在使用标识符时还有注意以下几点:
标识符的长度最好不要超过 8 位,因为在某些版本的 C 中规定标识符前 8 位有效,当两个标识符前 8 位相同时,则被认为是同一个标识符。
标识符是严格区分大小写的。例如 Imooc 和 imooc 是两个不同的标识符。
标识符最好选择有意义的英文单词组成做到"见名知意",不要使用中文。
标识符不能是 C++的关键字。
变量命名规则:传送门
变量及赋值
变量就是可以变化的量,而每个变量都会有一个名字(标识符)。变量占据内存中一定的存储单元。使用变量之前必须先定义变量,要区分变量名和变量值是两个不同的概念。
变量定义的一般形式为:数据类型 变量名;
多个类型相同的变量:数据类型 变量名, 变量名, 变量名...;
注意:在定义中不允许连续赋值,如 int a=b=c=5;是不合法的。
变量的赋值分为两种方式:
先声明再赋值
声明的同时赋值
基本数据类型
C++中,数据类型可分为:
基本数据类型
构造数据类型
指针类型
空类型四大类
数据类型分类
最常用的整型, 实型与字符型(char,int,float,double):
整型数据是指不带小数的数字(int,short int,long int, unsigned int, unsigned short int,unsigned long int):
自动类型转换
数据类型存在自动转换的情况.
自动转换发生在不同数据类型运算时,在编译的时候自动完成。
char 类型数据转换为 int 类型数据遵循 ASCII 码中的对应值.
字节小的可以向字节大的自动转换,但字节大的不能向字节小的自动转换
char 可以转换为 int,int 可以转换为 double,char 可以转换为 double。但是不可以反向。
强制类型转换
强制类型转换是通过定义类型转换运算来实现的。其一般形式为:
(数据类型) (表达式)
其作用是把表达式的运算结果强制转换成类型说明符所表示的类型
在使用强制转换时应注意以下问题:
数据类型和表达式都必须加括号, 如把(int)(x/2+y)写成(int)x/2+y 则成了把 x 转换成 int 型之后再除 2 再与 y 相加了。
转换后不会改变原数据的类型及变量值,只在本次运算中临时性转换。
强制转换后的运算结果不遵循四舍五入原则。
数据类型简单的列举
```cpp
char :1 个字节
char*(即指针变量): 4 个字节(32 位的寻址空间是 2^32, 即 32 个 bit,也就是 4 个字节。同理 64 位编译器)
short int : 2 个字节
int: 4 个字节
unsigned int : 4 个字节
float: 4 个字节
double: 8 个字节
long: 4 个字节
long long: 8 个字节
unsigned long: 4 个字节
64 位编译器:
char :1 个字节
char*(即指针变量): 8 个字节
short int : 2 个字节
int: 4 个字节
unsigned int : 4 个字节
float: 4 个字节
double: 8 个字节
long: 8 个字节
long long: 8 个字节
unsigned long: 8 个字节
```
常用库函数
(1)数学函数
平方根——sqrt
绝对值——fabs
乘幂——第一个参数作为底,第二个是指数 double pow(double, double)
实数的余数——两个参数分别是被除数和除数 double fmod(double, double)
(2)其他常用函数
ceil(x)求出不小于 x 的最小整数(返回与这个整数对应的 double 值)
floor(x)求出不大于 x 的最大整数(返回与这个整数对应的 double 值)
modf(x, doubleip)把 x 分解为小数部分和整数部分,小数部分作为函数返回值,整数部分通过指针 ip 返回。
Ps:输出小数 cout<<fixed<<setprecision(2)<<?
ASCII 码
getchar()读入一个 ASCII 码
putchar()输出一个 ASCII 码
while 循环-适合不确定循环次数时使用
while 循环
运行顺序:首先检验条件语句是否为真若为真,执行循环体,直至条件不成立,跳出循环。
参考例题 金币 描述
国王将金币作为工资,发放给忠诚的骑士。第一天,骑士收到一枚金币;之后两天(第二天和第三天)里,每天收到两枚金币;之后三天(第四、五、六天)里,每天收到三枚金币;之后四天(第七、八、九、十天)里,每天收到四枚金币……这种工资发放模式会一直这样延续下去:当连续 N 天每天收到 N 枚金币后,骑士会在之后的连续 N+1 天里,每天收到 N+1 枚金币(N 为任意正整数)。
你需要编写一个程序,确定从第一天开始的给定天数内,骑士一共获得了多少金币。 输入 一个整数(范围 1 到 10000),表示天数。 输出
骑士获得的金币数 样例输入 6 样例输出 14
do-while()循环
顺序大体与 while 循环一样,但程序至少执行一遍。 将上述程序改写为 do-while()循环
循环体可以用来解决的问题
从上述题目中可以看到
如果程序中存在需要连续反复执行多次的操作,就可以采用。
另外针对操作次数已经,建议使用计数循环方式。
如果操作次数未知,要求达到指定目标才停止,就采用条件循环。
很多函数大都是循环体。
字符串与数组
数组的操作
1°memcpy 函数(头文件<cstring)
数组不能直接复制,可利用 memcpy 函数
void memcpy(void dest, void *src, unsigned int count);
memcpy 函数用于 把资源内存(src 所指向的内存区域) 拷贝到目标内存(dest 所指向的内存区域);一个 size 变量控制拷贝的字节数;
使用方式 memcpy(b,a,sizeof(int)*k) 从 a 中赋值 k 个元素到 b 数组。
sizeof(int)*k 表示计算 int 型所占字节数,然后再乘以 k。
类比 sizeof(int*k),表示计算指向整型的指针变量 k 所占的字节数。
再浅显讨论 sizeof 的作用
sizeof(int)k 之所以用 sizeof(int)k 而不是用 k,因为 sizeof(int)*k 返回的是字节数,因为数组是 int 型的 sizeof 计算每个元素的字节长度,在乘以 k 既 k 个元素的字节,因为 memcyp 需要知道拷贝内存的字节数。所以拷贝是从开头开始计算,即 k 个元素是从 a[0]开始计算。由此可以推出将 a 中元素全部拷贝到 b 数组中,memcpy(b,a,sizeof(a))。
2°memset 函数(头文件<cstring)
void memset(void s , int ch , size_t n ) 在一段内存块中填充某一个给定的值,常用于较大的对结构体和数组的清零操作。
memset(结构体/数组名 , "用于替换的字符“ , 前 n 个字符 );
用法可以参考 memcpy,也要用 sizeof 来计算字节。
总结内存复制需要计算字节。
字符串操作 String
用法跟 char []没有太大区别,但是功能更加强大
函数
概念:组成 C 语言源程序的基本单位,完成特定功能的代码段.
例如 main()为主函数:程序入口
函数定义到使用分三步:
1.声明
2.定义函数
3.调用函数。
一、函数的声明:
在调用函数之前,进行该函数的声明 ,由于程序是由上到下执行,编译器不知道我们是否已经定义了某个函数,为了防止编译器编译的时候报错(函数调用)所以,要告诉编译器,我已经定义了哪些函数。
二、函数的定义:
返回值类型 函数名(形式参数类型 参数名 1,……)
{
函数体;
//return (返回值)
}
返回值类型有两种:
有参无返回值:void test(int x,float y){ }
有参有返回值: int max(int x,int y){ return x>y?x:y; }
函数的调用
定义:函数名(实参列表);
1)形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。
2)实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值 。
3)实参和形参在数量上,类型上,顺序上应严格一致,否则会发生类型不匹配的错误。
实参一定是确定值 不需要类型!!!
1.函数的参数
1)形参和实参
形参:在定义函数的时候,函数名后面小括号中的参数 , 格式: 数据类型 变量 如:int x;
形参的作用域:只能在本函数中使用
实参:调用函数的时候传递的参数
2)参数的传递的过程
实参的值拷贝一份放到函数形参中
3)函数传参有三种传参方式:传值、传址、传引用
①按值传递
ⅰ形参和实参各占一个独立的存储空间。
ⅱ形参的存储空间是函数被调用时才分配的,调用开始,系统为形参开辟一个临时的存储区,然后将各实参传递给形参,这是形参就得到了实参的值。
②地址传递
地址传递与值传递的不同在于,它把实参的存储地址传送给形参,使得形参指针和实参指针指向同一块地址。因此,被调用函数中对形参指针所指向的地址中内容的任何改变都会影响到实参。
③引用传递
引用传递是以引用为参数,则既可以使得对形参的任何操作都能改变相应数据,又使函数调用方便。引用传递是在形参调用前加入引用运算符“&”。引用为实参的别名,和实参是同一个变量,则他们的值也相同,该引用改变则它的实参也改变。
2.函数的返回值
概念:执行函数体中的程序段,最后获取的值并返回给主调函数,函数的返回值只能通过 return 关键字进行返回
格式:return 表达式;/ return (表达式);
返回值类型要与返回值相同。
是否要定义形参看是否有未知内容参与运算,调用时实参必须对应.参数传递的是值。
函数中可以有多个 return ,但是只有一个起作用,因为函数会结束后会带回一个值。
函数调用和返回
函数调用会使程序的控制权传递给被调函数而当前活动会被挂起。
当前函数执行完成后主函数从调用语句之后的语句恢复执行。
函数在执行完函数体的最后一条语句或或遇到 return 语句时返回。
返回类型和 return 语句
return 语句形式
return;
return 表达式;
非 void 函数必须返回一个与声明类型匹配的值否则会引起编译错误。
返回值 默认情况下,函数的返回值是按值传递的,得到控制权的函数将接受 return 语句中指定的表达式值得副本。
返回引用(我觉得特别重要)
函数声明为返回引用,则不需要对 return 语句中的表达式进行复制,而是返回对象本身。
函数返回引用仅是它所指向对象的一个别名。
//找出 s1 和 s2 中比较短的一个并返回其引用
const string& shorter(const string& s1, const string& s2)
{
return (s1.size() <= s2.size()) ? s1 : s2;
}
//函数返回结果时不会真正复制对象,返回的就是 s1 或 s2 本身。
string a=hello;
string b=word;
shorter(a,b)=“Hello”;//返回值为引用。
cout<<a<<' '<<b;//Hello word;
注:对引用返回值的修改会改变实际返回的对象,为了避免这种情况,可以将返回值声明称 const。
不能返回自动局部对象的指针或引用:函数执行结束后,函数占用的栈存储空间被释放,原本位于这段存储空间中的局部对象和临时变量都被释放,返回的局部对象引用或指针指向不再有效的内存区域
重载函数
如果同一个作用域内的几个函数名字相同但形参列表不同,则他们是重载函数
形参列表不同的概念:
1.形参数量不同
2.形参类型不同
3.常指针与指针不同,常引用与引用不同。
调用函数时如果存在多个重载函数,编译器将根据函数调用中指定的实参进行选择。
存储类别 static 静态存储
static 对象在控制流程第一次到达其定义点时被初始化,如果没有提供初始值就被自动初始化为 0;
在函数的后续调用中,初始化语句被跳过
静态对象的值在函数被多次调用之间保持有效,生存期会延续到整个程序结束但他的作用于仍然是局部的,因此需要在同一函数的两次调用之间保留某些数据时可以使用局部 static 对象。
素数的判断
1 定义法
除了 1 与自身外无其他因数。
指针的基本概念
1.每个变量都被存放在某个内存地址(以字节为单位)开始的若干个字节中。若干个字节(根据类型确定字节)
2.指针,也称作“指针变量“,大小为 4 个字节(或 8 个字节)的变量,其内容代表一个内存地址。
3.通过指针能够对任意地址的内存区域进行读写。
4.将内存比作房间,则指针内存储的是房间号。
指针的定义
类型名*指针变量名
int p; //p 是一个指针变量,变量 p 类型是 int
char q; //q 是一个指针变量,变量 q 的类型是 char
double r; //r 是一个指针变量,变量 r 的类型是 double
void *s; //s 是一个指针变量,变量 s 无类型。
指针的内容
int w=(int ) 40000;
w 的内容,w 是指向的地址 40000。w 的内容,w 是 w 地址 40000 起始的若干字节(sizeof(int))的所储存的内容。
通过指针访问指向的内存空间
intp=int 40000;//指向向地址 40000;
*p =123; 将 123 存入 p 所指向的地址后的若干字节(sizeof(int))的内存空间。
int n=*p,将 p 所指向的地址后的若干字节(sizeof(int))的内存空间赋值给 n;
补充
*1. 上述和 &的区别**
(1)p 是指指针 p 指向地址的那个变量,例如 int a=5;int p=a;那么 p 的值是 a 的地址,也就是指针 p 指向 a,p 则等于 a 的值,即 p=5。
(2)&,则是引用,比如说有定义 int a=5;再定义 int b=&a;那么这里的 b 则引用 a 的值,即 b=5,而再给 b 赋值:b=10,a 的值也会变为 10。
(3)函数定义里的参数*和 &的区别:
constexpr 必须用常量表达式初始化,也就是说必须在编译过程就能计算出结果(若要用函数作为 constexpr 的初始值那么该函数应该是 constexpr 类型的函数)。
constexpr 函数必须满足下述限制:
函数返回值不能是 void 类型 函数体不能声明变量或定义新的类型
函数体只能包含声明、null 语句或者一条 return 语句
在形参实参结合后,return 语句中的表达式为常量表达式
const 不要求在编译过程中就能计算出结果 (强调运行时不可改变) 大多数情况下并没有区别。
const 限定指针和引用。
指向 const 对象的指针 const type 指针
指向非 const 对象地 const 指针(常指针 ) type const 指针
指向 const 对象的 const 指针
const 限定引用,与 const 指针相似
auto 和 decltype
由 auto 声明变量的类型由编译器去自动分析表达式的类型,推断出变量的实际类型(很好用)
引用
左值与右值
区别 左值 右值
赋值表达式 出现在赋值号左边 在赋值号右边的
地址与名字 可以取地址的有名字 不能取地址的没有名字
生成的表达式 返回左值引用的函数 赋值 下标 解引用和前缀自增自减运算符 返回非引用类型的函数 连同算术、关系、位运算、后缀自增自减运算符、字面值常量、要求转换的表达式。
文件的输入输出
文件的读写
如果想以输入方式打开,就用 ifstream 来定义;
如果想以输出方式打开,就用 ofstream 来定义;
如果想以输入/输出方式来打开,就用 fstream 来定义
与容器一样流不会降低自己空间,即使用了 ss.clear()😭 清空操作如下 😦
<br>
写在最后:
Name:风骨散人,目前是一名双非在校大学生,预计考研,热爱编程,热爱技术,喜欢分享,知识无界,希望我的分享可以帮到你!名字的含义:我想有一天我能有能力随心所欲不逾矩,不总是向生活低头,有能力让家人拥有富足的生活而不是为了生计而到处奔波。“世人慌慌张张,不过是图碎银几两。偏偏这碎银几两,能解世间惆怅,可让父母安康,可护幼子成长 ...”
文章主要内容:
Python,C++,C 语言,JAVA,C#等语言的教程
ACM 题解、模板、算法等,主要是数据结构,数学和图论
设计模式,数据库,计算机网络,操作系统,计算机组成原理
Python 爬虫、深度学习、机器学习
计算机系 408 考研的所有专业课内容
目前还在更新中,先关注不迷路。微信公众号,cnblogs(博客园),CSDN 同名“风骨散人”
如果有什么想看的,可以私信我,如果在能力范围内,我会发布相应的博文!
>感谢大家的阅读!😘你的点赞、收藏、关注是对我最大的鼓励!
版权声明: 本文为 InfoQ 作者【风骨散人】的原创文章。
原文链接:【http://xie.infoq.cn/article/6f21c60afcc89e67a83278ef4】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论