C语言和C++的区别
1. C++基于过程的编程
1. 简单程序示例
示例1:
#include iostreamusing namespace std;int main(){ int max(int x, int y);//函数声明int a,b,c; c=max(a, b); return 0; } int max(int x, int y){ int z; if(x y) z=x; else z=y;}main函数必须声明为int类型。系统需要程序才能运行。 最后,我们需要将值返回给操作系统。如果程序成功运行,则返回值0 给操作系统,否则返回值-1。
函数体用“{}”括起来。
cout是C++系统定义的一个对象名,称为输出流对象。 cin 是一个输入流对象(在输入时,两条数据由一个或多个空格分隔,而不是由逗号或其他符号分隔)。
“#include iostream”是一条C++预处理指令和一条include指令。它的作用是将“iostream”文件的内容合并到命令所在的程序文件中,替换指令。
“使用命名空间std”表示使用命名空间“std”。 C++ 标准库类和函数在命名空间std 中声明。
“//”表示使用从头到尾的一行作为注释,但也可以用“/./”表示多行注释。
程序第五行是max函数的声明。在此声明之后,max函数可以写在main函数之后。
2.C++程序实现过程
每个程序单元由三部分组成:预处理指令、全局声明和函数。
3. 变量
3.1 变量基础知识
变量属于标识符。标识符是指用于标识变量、函数、数组、类型等实体名称的有效字符序列。
变量名代表了内存中的存储位置。当程序从变量中检索值时,实际上是通过变量名找到对应的内存单元,并从那里读取数据。
变量有两个属性:作用域(全局或局部)、保留期限(静态或动态)。
变量命名约定:
只能包含3 个字符:字母、数字和下划线。
第一个字符必须是字母或下划线。
常量变量也称为只读变量。
这与基于此变量添加限制相同。存储单元内的值无法更改。
区分使用#define 指令定义的符号常量和使用const 定义的常量变量。
3.2 局部和全局变量
局部变数
函数内定义的变量仅在该函数或复合语句的范围内有效。
形式参数也是局部变量
出现在函数原型声明中的参数名称仅在原型声明内的括号内有效。
全局变量
在函数外部定义的变量是称为全局变量的外部变量,它们的范围是从变量定义的地方到源文件末尾。
当一个函数更改全局变量的值时,它会影响其他函数,并且其他函数中引用的同名变量也会发生更改。
除非必要,建议您不要使用全局变量(它们会占用存储单元并降低您的函数的通用性)。
3.3 变量存储类别
静态存储方式
在程序执行过程中,系统为变量分配固定的存储空间。
将全局变量存储在静态存储区中
动态存储方式
在程序执行过程中,系统动态地为变量分配存储空间。
动态存储区存储函数的形式参数、函数内定义的变量(没有静态变量的局部变量)、现场保护以及函数调用的返回地址。
变量存储类
指数据在内存中的存储方式
包括auto、static、register、extern
自动变量:函数内的局部变量。如果不添加静态声明,编译系统会动态分配存储。
静态局部变量:函数内的局部变量的值在调用完成后不会消失,而是保留原来的值。这意味着该变量占用的存储单元在下次调用该函数时不会被释放。上一次调用结束时的值。
静态局部变量在函数调用后存在,但不能被其他函数引用,也不能被其他函数引用。
静态局部变量在编译时分配初始值(默认为0 或NULL 字符),而自动变量在函数调用时分配初始值。
寄存器变量:必要时直接从寄存器中检索变量来参与操作,而不需要在内存中访问它们。
全局变量或外部变量:在函数外部定义,范围是从函数定义到程序文件末尾。
extern 只是通过声明定义的外部变量来扩展范围
如果使用static 声明外部变量,则该外部变量只能从此文件引用,而不能从其他文件引用(静态外部变量)
3.4 变量声明和定义
函数声明是函数原型,函数定义建立函数的功能。
语句分为定义语句(需要创建存储空间,如int a;)和引用语句(不需要创建存储空间,如extern int a;)。
广义上讲,声明包括定义,但为了方便起见,创建存储的声明称为定义,不需要创建存储的声明称为声明。
4. 操作员
操作员类型
算术运算符:+、-、*、/、%、++、-
关系运算符:==,=,=,=
逻辑运算符:||,
位运算符:(按位左移)、(按位右移)、|、^(按位异或)、~(按位求反)
赋值运算符:=及其扩展赋值运算符
条件运算符:
逗号运算符:
指针运算符:*
引用和地址运算符:
计算字节数的运算符:sizeof
强制转换运算符
会员运营商:
操作员指向成员:-
下标运算符:[]
其他:函数调用运算符
运算符优先级:算术运算符(使用“”或“”符号优先于“==”和“!=”)关系运算符和||
在进行运算时,不同类型的数据必须转换为同一类型。转换规则为:左侧水平箭头表示具体的转换,垂直箭头表示操作数不同类型时的转换方向。箭头的方向仅指示数据类型的级别(从低到高)。
A[char,short]==B(int) B -- C[unsigned] C -- D[long] D -- E[double] F[float] -- E 自增和自减运算符: ++ i (使用i前将i的值增加1)、i++(使用i前将i的值增加1)、-i(使用i前将i的值减少1)、(使用i前、i后) ,i的值减1)
赋值运算符:如果赋值运算符两边的类型不一致,但均为数字或字符类型,则赋值时会自动进行类型转换。
将双精度数分配给浮点数时,请注意不要溢出数值范围。
将字符类型分配给整数时,将字符的ASCII 码分配给整数。
将int、short 或long 类型的数据分配给char 变量,并仅将低8 位按原样发送给char 变量(发生截断)。
最终,不同类型的整数数据之间的分配是以下之一: 根据存储设备中的存储格式直接传输。
条件运算符(仅限三元运算符):
示例:max=(ab)?
5 程序结构
5.1结构选择
如果().否则如果().否则
多分支选择结构: switch() {case x:case y:default :}
每种情况和默认的出现顺序不会影响执行结果。
当执行switch 语句时,根据switch 表达式的值找到匹配的case 子句,并从该case 子句继续执行,而不做任何进一步的决定。所以此时需要一个“break”语句来完成跳转的目的。外部。
多个case可以共享一组执行语句
5.2 循环结构
while(表达式)语句
do 表达式while (表达式) (do-while 语句)
for(表达式1;表达式2;表达式3) 语句
您只需使用“break”或“Continue”即可跳出循环或此循环。
6. 功能
6.1 功能分类
用户视角:
系统函数,即库函数
用户自定义函数
函数格式:
不带参数的函数
带参数的函数
6.2 函数定义
无参数函数定义/*类型名函数名([void]){部分可执行语句声明}*/无参数函数定义/*类型名函数名([void]){部分可执行语句声明}*/6.3 功能参数
6.4 函数调用
如何致电
函数语句函数表达式
功能参数
printstar(); //函数语句c=2 * max(a,b);//函数表达式m=max(a, sqrt(b));//函数的参数如果有多个实参,则为实际值参数评估顺序未确定。许多C++ 系统从右到左求值。例如,如果变量i 的值为3:
func(i, ++i);/*func(3,4),按从左到右的顺序求值func(4,4),按从右到左的顺序求值*/6.4 函数声明和函数原型
函数声明是指提前将函数的相关信息告知编译系统,以便在函数未定义的情况下编译能够顺利进行。
函数声明中不需要写形参名称,只需写形参的类型即可。该声明成为函数的原型。
float add(float, float);//函数原型
/*函数类型函数名(参数类型1、参数类型2.);
函数类型函数名(参数类型1参数名1,参数类型2参数名2.);
6.5 内置函数(内联函数)
在编译时,将函数代码嵌入到主调用函数中,而不是将过程转移到外部。
声明函数和定义函数时可以同时写inline,也可以只在声明函数时加inline,但定义函数时不能加inline。
内联函数不能包含复杂的控制语句,例如循环或switch 语句。
6.6 函数重载
在C++中,可以使用相同的函数名定义多个函数,并且这些函数可以具有不同数量的参数和参数类型。
即使函数类型不同,参数的数量和类型也不允许相同,例如:
int f(int);long f(int);void f(int); 重载函数在参数数量、参数类型或参数顺序上必须至少有一个差异。函数的返回值类型可以相同。 6.7 函数模板不同。
创建一个没有指定函数类型和形式参数类型的通用函数。虚拟类型用于表示定义函数模板的通用格式。 T//T 也可以替换为类型参数。两者都代表类型名称。 T max(T a, T b, T c){ if(ba) a=b; if(ca) a=c; 仅适用于函数体相同的情况。函数具有相同数量的参数但类型不同
6.8 带默认参数的函数
指定默认值的参数必须位于参数列表的右端
如果函数是在函数调用之前定义的,则必须在函数定义中指定默认值。如果函数是在函数调用之后定义的,则函数声明必须在函数调用之前并指定默认值。函数声明不需要您在定义函数时指定默认值。
函数不能同时是重载函数和具有默认参数的函数。
6.9 内部和外部函数
内部函数:只能从该文件内的其他函数调用
静态类型标识符函数名(形参列表)
外部函数:可以从其他文件调用
extern int func(int a, int b)//省略extern,默认为外部函数
6.10 传递函数参数
使用变量名称作为实际参数和形式参数。形式参数是变量的值,传递是单向的。
void swap(int a, int b);int i=3, j=5;swap(i, j);//调用函数时,形参和实参不在同一个存储。 Pass by value(按值传递)传输变量的地址。形参是指向实参变量的指针变量(地址),实参是变量的地址。
void swap(int *p1, int *p2);int i=3, j=5;swap(i, j);//值传递(值传递方式),实参的值为变量的地址,形式参数是实际参数引用:使用引用作为形式参数,使用形式参数名称作为实际参数的引用。
void swap(int a, int b);int i=3, j=5;swap(i, j);//地址传输(地址传输方式),实际参数为变量名和变量地址7数组将被转移。
7.1 定义和引用数组
类型名数组名[常量表达式] //一维数组定义
数组名[下标] //一维数组引用
类型名数组名[常量表达式] [常量表达式] //二维数组的定义
数组名[下标][下标] //引用二维数组
二维数组中元素的顺序是逐行存储的。即先将第一行的元素依次存储在内存中,然后将第二行的元素存储在内存中。
多维数组元素在内存中的排列顺序。第一个维度的下标变化最慢,最右边的下标变化最快。
7.2 使用数组作为函数参数
数组元素可以用作函数参数,其使用方式与变量相同。数组名称作为实际参数和形式参数传递。 C++ 实际上到处都使用形式参数组名称作为指针变量。
/*.*/void select_sort(int array[], int n);//函数int a[10];select_sort(a,10);//函数调用/*.*/void select_sort( int array[], int n)//函数定义{/*.*/}/*.*/
void select_sort(int array[], int n);//函数
整数a[10];
select_sort(a,10);//调用函数
/*.*/
void select_sort(int array[], int n)//函数定义
{
/*.*/
}
当使用变量作为函数参数时,只能将实参变量的值传递给形参变量,即使形参的值在函数调用过程中发生变化。也就是说,实参的值不依赖于形参。如果数组的值发生变化,并且将数组名用作函数参数,则当形参组元素的值发生变化时,该值也会发生变化。实际参数组元素也会发生变化。 7.3 字符数组
7.3.1 字符数组基础知识
只能给字符数组的元素赋值,而不能使用赋值语句给整个数组赋值char c[5];c={'C', 'h', 'i' , ' n', 'a'};//错误c[0]='C'; c[2]='i'; ]='a';//正确char str[]={'我很高兴' };//正确,使用字符串常量初始化字符数组char str[]='I am happy';//正确的字符串结束标志:字符串末尾字符'\0' 已达到。对于字符串常量,系统会自动在每个字符后添加“\0”作为终止符。检测程序中字符串的长度也依赖于字符串结束标志。
如果输入的字符串比字符数组的长度长,此时系统不会报错,而是将多余的字符元素按顺序存储在定义的字符数组的接下来的几个字节中。这可能会破坏其他数据,甚至导致意外错误。
7.3.2 字符串处理函数
字符串连接函数strcat(char[], const char[]); 字符串复制函数strcpy(char[], const char[]);//转换str2的前两个字符。 str1 str1=str2;//错误,不能直接将一个字符数组赋值给另一个字符数组。字符串比较函数strcmp(const char[], const char[]);/* 如果字符串1 等于字符串2,则函数的值为如果字符串1 大于字符串2,则函数的值为正整数马苏。如果字符串1 小于字符串2,则函数的值为负整数。 */字符串长度function strlen(const char[]);//该值为字符串除'\0'之外的实际长度。 7.3.3 字符串类
包含C++标准库中的字符串头文件#include stringstring string1;//定义字符串变量string1='China';//赋值使用简单的运算符连接(+),比较(==,=,=,=), 复制(=) 字符串数组
每个字符串元素不必具有相同的长度。同一元素也可以有不同的长度。每个元素的值包括\08 和字符串本身,不包括指针。
变量的地址称为变量的指针。存储地址(即指针)的变量在C++中称为指针变量。例如,i_pointer 是一个指针变量。 i_pointer表示i_pointer指向的变量。 8.1 定义和引用指针变量
定义指针变量的一般格式为: 基本类型* 指针变量名/* 基本类型是指指针变量所指向的变量类型。 '*'表示定义的变量是引用指针变量。 *pointer_1; int a=100;pointer_1=a;//将变量a的地址赋给pointer_1int *pointer_2=a;//定义一个指针变量并初始化指针变量赋值p=a;p=array;//数组p=array[i];p=max;//与函数p1=p2; 具有相同的优先级;但8.2 指针和函数是从右到左关联的。
8.2.1 指针作为函数参数
void swap(int * p1, int * p);//声明一个指针参数的函数int *pointer_1, *pointer_2;swap(pointer_1, pointer_2);//调用函数void swap(int * p1, int * p) //函数定义{ /*.*/}8.2.2 指向函数的指针变量
int max(int x, int y);int (*p)(int,int);//定义一个指针变量p=max;//指针p指向max函数的入口地址m=p ( a, b );8.2.3 返回指针值的函数( )
//类型名称* 函数名称(参数列表) int *a(int x, int y);8.3 指针和数组
int a[10];int * p;p=a[0];//a[0]指向地址变量的指针pp=a;//相当于上面/*p+1指向同一个数组的下一个元素,实际地址是p+1*d*/8.4指针和字符串
访问字符串:使用字符数组存储字符串、使用字符串变量存储字符串、使用字符指针指向字符串char str1[]='I love China !';cout str1 endl;string str2='I love China!' ;char * str3='我爱中国!';cout str3 endl;8.5 const 和void 指针
指向常量的指针变量:虽然不能通过指针变量改变它所指向的对象的值,但是可以改变指针变量p(即p指向的点)的值,这是类型常量。 name * 指针变量名; //常用作函数参数,防止指针形参所指向的对象值的变化影响实参常量指针。指定的指针变量的值是一个常量。也就是说,指针变量所指向的指针是不能改变的。类型名称* const 指针变量名称; //必须在定义时通过指定它指向常量指针来初始化。指针变量指向一个固定的对象,并且该对象的值不能通过指针变量更改。 const类型名* const指针变量名;//指定必须在定义时初始化,指向一个void指针。指向空类型或不指向特定类型的数据(这是临时的)。
9. 报价
与给变量赋予不同的名称相同
数据类型后面出现的是引用声明符,否则是地址运算符(声明中出现的是引用声明符,否则是地址运算符)。
如果声明引用,则必须同时初始化它。声明后,不能用作其他变量的引用。
无法创建引用数组、无法创建对引用的引用、无法创建对引用的指针
引用机制主要作为函数参数来扩展函数中传递数据的功能(地址传递方式)。
10. 用户自定义数据类型
结构类型(structural)、联合类型(union)、枚举类型(enumeration)、类类型(class)
10.1 结构(结构)
此结构在一个组合项中包含不同类型(或相同类型)的多个数据项。
10.1.1 结构声明、定义、初始化和引用
/*声明*/结构体类型名称//声明{成员列表};//类型名称成员名称/*定义*/struct Student{/*.*/};Student Student1,student2;//先声明再定义variable struct Student{/*.*/}student1,student2;//声明(Student struct)并定义变量(student1,student2)
2)/*初始化*/struct Student{/*...*/}student1 = {/*...*/};struct Student{/*...*/};Student student2 = {/*...*/};/*引用*/student1 = student2;student1.num = 10010;//结构体变量名.成员名("."是成员运算符, 优先级最高)10.1.2 指向结构体变量的指针 /*以下三种形式等价*//*p为指向结构体变量的指针*//*结构体变量.成员名,eg:stu.num (*p).成员名,eg:(*p).num p->成员名(->为指向运算符),eg:p->num*/ p->n++;//得到成员n的值,用完后使它加1 ++p->n;//得到成员n的值,并使之加1,然后再使用它10.1.3 结构体类型数据作为函数参数 用结构体变量名作参数用指向结构体的指针作参数,将结构体变量的地址传给形参用结构体变量的引用作函数参数,成为实参的别名10.1.4 new和delete运算符进行动态分配撤销存储空间 new 类型[初值]//new分配数组空间时不能指定初值new int(100);//初值为100的整数空间,返回存储空间的地址new char[10];new int[5][4];float *p = new float(3.14159);delete 指针变量;delete [] 指针变量;10.2 枚举类型(enum) 一个变量只能有集中可能的值,可以定义为枚举类型枚举类型按常量处理,成为枚举常量,编译系统按定义时的顺序对它们赋值为0,1,2,3…enum 枚举类型名 {枚举常量表};enum weekday{sun, mon, tue, wed, thu, fri, sat};//声明枚举类型weekday workday, week_end;//定义变量enum weekday workday, week_end;//C语言定义方式enum weekday{sun, mon, tue, wed, thu, fri, sat}workday, week_end;//声明同时进行定义workday = (weekday)2;//C语言强制类型转换workday = weekday(2);//C++强制类型转换10.3 声明新类型(typedef) 使用typedef声明一个新的类型名类代替已有的类型名也可以对一个结构体类型声明一个新的名字typedef int INTERGER;typedef struct{ int month; int day; int year;}DATE;//DATE为新类型名,而不是结构体变量typedef int NUM[100];//声明NUM为整型数组类型,包含100个元素typedef char * STRING;//声明STRING为char * 类型typedef int (* POINTER)();//声明POINTER为指向返回整型的函数的指针类型最后,如果你想学C/C++可以私信小编“01”获取素材资料以及开发工具和听课权限哦! 版权声明:本文转载于今日头条,版权归作者所有,如果侵权,请联系本站编辑删除