从面向过程到面向对象,C 和 C++ 基本语法区别

本文最后更新于:2021年9月26日 晚上

前言:

C 语言是一种通用的编程语言,广泛用于系统软件与应用软件的开发。于1969年至1973年间,为了移植与开发 UNIX 操作系统,由丹尼斯·里奇与肯·汤普逊,以 B 语言为基础,在贝尔实验室设计、开发出来。C++语言在 C 语言的基础上添加了面向对象编程和泛型编程的支持。继承了 C 语言高效,简洁,快速和可移植的传统。是一种被广泛使用的计算机程序设计语言。支持多重编程模式,例如过程化程序设计、数据抽象、面向对象程序设计、泛型程序设计和设计模式等。

1、头文件:

C 语言 C++
stdio.h iostream
math.h cmath
string.h cstring
stdlib.h cstdlib
…… ……

2、命名空间:

未使用 std 命名空间:

1
2
3
4
5
6
7
8
#include <iostream>		//#include <stdio.h>

int main()
{
std::cout << "Hello World!" << std::endl; //C++

return 0;
}

使用 std 命名空间后:

1
2
3
4
5
6
7
8
9
10
#include <iostream>		//#include <stdio.h>
using namespace std; //使用 std 命名空间

int main()
{
printf("Hello World!"); //C 语言
cout << "Hello World!" << endl; //C++

return 0;
}

using namespace std;

使用命名空间:using namespace

std 就是一个命名空间

cout、endl、cin、就是在 std 这个空间定义命名的。

3、输入输出:

输出:cout <<

输入:cin >>

换行:endl

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
using namespace std;

int main()
{
int a;

scanf("%d",a); //C 输入
cin >> a; //C++输入

printf("%d\n",a); //C 输出
cout << a << endl; //C++输出

return 0;
}

4、基本数据类型:

C 和 C++ 的基本数据类型几乎一样。

int、short、char、float、double、unsigned、signed

在 C++ 加入了一个布尔类型:bool

1、bool 类型只有2个常量值: true 真、false 假

2、实际运行时,true 当做1来处理,false当做0来处理

3、让代码看上去更直观。

1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
using namespace std;

int main()
{
bool a;

a = true; //为真 1
a = false; //为假 0

return 0;
}

5、结构体:

在 C 中,定义一个结构体,类型的 struct 不能省略。

在 C++ 中,定义一个结构体,类型的 struct 可以省略。

1
2
3
4
5
6
7
8
struct Stu		//struct关键字 Stu 结构名
{
int num;
int age;
};

struct Stu c; //C
Stu cpp; //C++

6、强制类型转换:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
using namespace std;

int main()
{
double a = 3.8;
double b = 6.6;
int c = 30;
int d;
//强制转换为 int 类型
d = c + (int)(a*b); //C
d = c + int(a*b); //C++

return 0;
}

7、条件运算符:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
using namespace std;

int main()
{
int a = 10;
int b = 15;

a > b ? a : b; //在 C 里面 只能去使用表达式的返回值
(a > b ? a : b) = 20; //在 C++ 里面 可以这样给 b 赋值
cout << b << endl;

return 0;
}

8、for 循环:

C 中:for 循环的循环变量,必须先定义,循环变量的作用域在整个 main 函数里。

C++ 中:for循环的循环变量,可以在表达式里面定义,循环变量的作用域只在循环里。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
using namespace std;

int main()
{
//C 的 for 循环
int i;
for (i = 0; i < 10; i++)
{

}

//C++ 的 for 循环
for (int i = 0; i < 10; i++)
{

}

return 0;
}

9、作用域运算符 ::

1、区分全局和局部

2、类的作用域。

3、命名空间

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
using namespace std;

int a = 10;

int main()
{
int a = 50;

cout << a << endl; //输出局部变量 a
cout << ::a << endl; //输出全局变量 a

return 0;
}

10、动态内存分配:

编程语言 开辟内存 释放内存 方式
C malloc free 函数
C++ new delete 运算符
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
using namespace std;

int main()
{
int *p1, *p2, *p3;
p1 = new int; //p1指向一个 int 空间
p2 = new int[5]; //p2指向一个5个整形元素的数组 首地址
p3 = new int(5); //p3指向一个 int 空间 空间初始化为5

//释放空间
delete p1;
delete[]p2;
delete p3;

return 0;
}

11、变量的引用:

1、变量的引用是 C++ 重要的扩充

2、作用:给一个变量取别名,变量和别名共享这块内存。

3、声明一个引用,并不会开辟空间。

4、声明引用的时候,一定要初始化。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
using namespace std;

int main()
{
int a; //定义 a
int &b = a; //b 是 a 的引用 a 和 b 共享一个内存。

a = 10;
cout << b << endl; //b = 10

b = 15;
cout << a << endl; //a = 15

return 0;
}

传递的形参交换,不会影响到实参,所以输出 x = 10,y = 20

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
using namespace std;

//定义函数,用来交换2个数的值
void Swap(int a, int b)
{
int t = a;
a = b;
b = t;
}

int main()
{
int x = 10;
int y = 20;

Swap(x, y);

cout <<"x = " << x << endl; //x = 10
cout <<"y = " << y << endl; //y = 20

return 0;
}

使用指针的方式来使实参交换(比引用的方式增加了内存的开销)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
using namespace std;

//定义函数,用来交换2个数的值
void Swap(int *pa, int *pb)
{
int t = *pa;
*pa = *pb;
*pb = t;
}

int main()
{
int x = 10;
int y = 20;

Swap(&x, &y);

cout <<"x= " << x << endl; //x = 20
cout <<"y= " << y << endl; //y = 10

return 0;
}

使用引用的方式来使实参交换(比指针的方式节省了内存的开销)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
using namespace std;

//定义函数,用来交换2个数的值
void Swap(int &x, int &y)
{
int t = x;
x = y;
y = t;
}

int main()
{
int x = 10;
int y = 20;

Swap(x, y); //节省了在函数中的内存开销

cout << "x= " << x << endl; //x = 20
cout << "y= " << y << endl; //y = 10

return 0;
}

12、内置函数、内联函数:

C 中的宏函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
using namespace std;

//宏函数
#define FUN(a,b)(a*b+a/b) //预处理:得到.i文件 - 汇编:得到.S - 编译:得到.obj - 链接 得到.exe

int main()
{
int x = 10;
int y = 20;

int a = FUN(x, y);
cout << a << endl;

return 0;
}

C++ 内置函数,内联函数

关键字:inline

编译过程中,将所调用的函数代码直接嵌入到主调函数中。

1、内置函数可以节省运行时间,但是会增加目标代码的长度。

2、在使用内置函数的时候,尽可能的使用5行以内,经常出现的函数。

3、不能包含复杂的语句:循环、switch等。

4、inline 比较灵活,并不是一个指令性的关键字。

​ inline 只是程序员对编译系统的一种建议,不一定被采纳。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
using namespace std;

//内置函数/内联函数 返回3个数的最大值
inline int Max(int a, int b, int c)
{
if (b > a)a = b;
if (c > a)a = c;
return a;
}

int main()
{
int x = 10;
int y = 20;
int z = 18;

int max;
max = Max(x, y, z);

cout << max << endl;

return 0;
}

13、带默认参数的函数:

声明函数的时候,可以给形参初始化一个默认值,调用的时候,如果没有具体的实际参数,就使用默认值进行计算。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
using namespace std;

int Max(int a = 10, int b = 15, int c = 18) //a、b、c、自带默认参数
{
if (b > a)a = b;
if (c > a)a = c;
return a;
}

int main()
{
int x = 50;
int y = 60;
int z = 80;

cout << Max() << endl;
cout << Max(x) << endl;
cout << Max(x,y) << endl;
cout << Max(x, y, z) << endl;

return 0;
}

14、函数的重载:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <iostream>
using namespace std;

int Max(int a, int b)
{
if (b > a)a = b;
return a;
}

int Max(int a, int b, int c)
{
if (b > a)a = b;
if (c > a)a = c;
return a;
}

float Max(float a, float b, float c)
{
if (b > a)a = b;
if (c > a)a = c;
return a;
}

double Max(double a, double b, double c)
{
if (b > a)a = b;
if (c > a)a = c;
return a;
}

int main()
{
cout << Max(1, 2) << endl;
cout << Max(1, 2, 3) << endl;
cout << Max(3.6f, 3.8f, 4.9f) << endl;
cout << Max(6.6, 8.98, 7.20) << endl;

return 0;
}

1、函数名相同,参数的个数、类型、顺序不一样。

2、在调用的时候,根据给的实际参数取自动匹配需要用到的某一个重载函数。

3、返回值类型并不能决定这是不是函数重载。

4、参数的个数、类型、顺序至少需要一个不一样。

5、函数重载会和带默认参数的函数起冲突。

1
2
int Max(int a, int b);
int Max(int a, int b, int c = 18); //有歧义

15、函数的模板

重载函数如果过多,编写和阅读都会很繁琐,可以使用模板来代替,将数据类型参数化:

1、建立一个通用的函数,函数的类型和参数的类型可以不指定,使用一种虚拟的类型。

2、凡是函数体相同的多个函数,都可以使用函数模板。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
using namespace std;

//函数模板的声明
template <typename Ty> //Ty 虚拟的数据类型

//定义
Ty Max(Ty a, Ty b, Ty c)
{
if (b > a)a = b;
if (c > a)a = c;
return a;
}

int main()
{
cout << Max(1, 2, 3) << endl;
cout << Max(3.6f, 3.8f, 4.9f) << endl;
cout << Max(6.6, 8.98, 7.20) << endl;

return 0;
}

本博客所有文章仅供学习和交流所用,未经作者允许,均禁止转载!