C++_1_C与C++的区别

内容:
(1)C++简介和编程的基本变化
(2)命名空间的概念和使用
(3)结构体、联合、枚举的不同
(4)布尔类型 以及 运算符别名
(5)函数的重载、缺省参数、哑元以 及内联

1.简介和编程的基本变化
1.1 C语言的简介
1969年,使用汇编语言编写操作系统,汤普逊 发明了一门语言 B语言,丹尼斯-里奇 在B语言的基础上 New B语言,后来改名为C语言
C语言 出生于 1972年

1.2 C++语言的简介
在C语言的基础上,本贾尼-斯特劳斯特卢普(Bjarne Stroustrup)做了一定的扩展,起名 New C语言,后来改名为“C with Classes(带类的C)”,想到了C语言中的运算符 ++, 最后改名为C++,于1983年诞生

1.3 相关的历史事件
(1)1983年, C++语言诞生
(2)1985年,CFront1.0 第一个C++编译器诞生
(3)1987年,GNU C++编译器
(4)1990年,Borland C++
(5)1992年,Microsoft C++
(6)1998年,第一个ISO C++标准诞生
(vc6.0 1998年诞生)
(7)2003年,ISO对C++标准做了修改,C++03标准
(8)2011年,最新的C++标准,C++11或者C++0x
(部分编译器支持)

1.4 C++和C语言的比较
(1)C++和C语言都是编译型语言,也就是只有编译之后才能运行的,有些是不需要编译就可以直接运行的,是通过解释器执行的,这种语言叫脚本语言
vi xxx.sh date;cal;ls -l;
(2)C++和C语言都是强类型语言,所有的标示符都必须有数据类型
a; a = 10; //error
(3)C++对C语言提供兼容,并且做了优化提供了更多的特性
a.语言风格更加简洁
b.类型检查更加严格
// error
int* pi = malloc(sizeof(int));
c.支持面向对象编程
d.支持运算符重载
1+1 = 2
一个人 + 10
e.支持异常处理
f.支持泛型编程
double float ...

1.5 C++的主要用途
(1)用于游戏开发
(2)用于系统和驱动开发

C++ 没有C语言更加底层,也没有JAVA/C#更加偏向应用级
网站技术:javaWeb/.net/PHP

编写第一个C++程序

1.6 编程的基本变化
(1)文件的扩展名发生变化
C语言中源文件: xxx.c
C++中源文件:.C/.cc/.cxx/.cpp(plus plus)

C语言中头文件: xxx.h
C++中头文件: xxx.hpp / xxx.h

(2)头文件的变化
C语言中: #include <stdio.h>
C++中: #include <iostream>

使用C语言中头文件:
#include <cstdio> 去掉.h,前面加c
vi /usr/include/c++/4.6/cstdio文件中包含的还是 stdio.h文件

(3)输入输出的变化
C语言中:scanf/printf 函数
C++中:cin/cout 对象

(4)编译器的变化
C语言中:gcc/cc xxx.c
C++中: g++/c++ xxx.cpp
gcc/cc xxx.cpp -lstdc++

g++/c++ 的编译选项和 gcc/cc一样
-c 只编译不连接
-S 生成汇编文件
-o 指定输出文件名
-O 优化
...

(5)命名空间
using namespace std;
使用标准命名空间,标准库中类以及函数等全部放在std的命名空间中

2.命名空间的学习和使用
引入了命名空间(namespace)的概念,主要用于区分同名的函数、变量等

2.1 自定义命名空间
namespace 命名空间名字
{
变量、函数等
}

注意:
和结构体的格式非常相似,但是关键字不同,并且没有分号,用于作用域的限定,并不是一种独立的数据类型

:n1,n2 > 表示将n1行到n2行之间的代码向右缩进
:n1,n2 < 表示将n1行到n2行之间的代码向左缩进

2.2 使用名字空间的方式
(1)使用名字空间指令的方式使用命名空间
如:
using namespace std;

(2)使用作用域限定符
:: - 作用域限定符,相当于"的"
如:
std::cout << "大家好才是真的 好";

(3)使用名字空间声明的方式去使用名字空间中的部分内容
如:
using std::cout;
using std::endl;
cout << "大家好才是真的好" << endl;

2.3 无名名字空间
如果一个标示符没有被置于任何名字空间中,则默认为无名/匿名名字空间中,可以使用如下形式去访问标示符:

::无名名字空间成员名

2.4 扩展
(1)同一个命名空间中的内容可以分开写
(2)命名空间中的函数声明和定义也可以分开,也就是函数的定义可以放在命名空间的外面
(3)命名空间可以进行嵌套

3.结构体、联合、枚举的不同
3.1 结构体中的不同
C语言中:
struct Student/*结构体类型名 */{ ... };
struct Student/*左边整体作为一 个完整的数据类型*/ s;

typedef struct Student
{ ....}Student/*别名*/;

typedef struct
{....}Student/*别名*/;

C++中:
struct Student{...};
[struct] Student s;

(1)C++中的结构体定义变量时可以省略struct关键字
(2)C++中的结构体内部可以定义函数,并且函数内使用成员变量时不需要. ->之类的

注意:
(1)在C语言中如果一个函数的形参表为空时,表示可以接受任意多个任意类型的实参
(2)在C++中如果一个函数的形参表中为空时,表示不接受任何实参

思考:
为什么s和s2调用的是同一个show函数而打印出来的数据内容却不一样??
(以后讲到)

3.2 联合的不同之处
(1)定义联合变量的时候可以省略union关键字
(2)支持匿名联合

如:
union un/*un是联合类型名*/{..};
[union] un u;

union{...}; 匿名联合

3.3 枚举的不同之处
(1)枚举类型在定义变量时也可以省略enum关键字
(2)C语言的枚举 本质上就是整型,可以使用整数进行赋值
C++中的枚举 是一种独立的数据类型,不能使用整数进行赋值
(int类型的值域 比 枚举类型的大)

4.布尔类型以及运算符的别名
4.1 布尔类型
C语言中:
bool #include<stdbool.h>
int

C++中:
bool类型是C++中的基本数据类型,bool类型的值有两个:true 和 false,其本质上就是 1 和 0
bool类型本质上就是一个单字节整数,任何基本数据类型都可以被隐式地转换为bool类型

小结:
bool类型定义变量,可以作为函数的参数和返回值类型,当然也可以定义指针类型

4.2 运算符别名
&& & | ||
^ 异或运算符 不同为真,相同为假
作业:
查询手册string类型中的各种函数,尝试着去使用string类型中的各种函数
如:
string s;
s.c_str();

时间: 2025-01-12 20:39:48

C++_1_C与C++的区别的相关文章

Nginx 反代参数:$X-Real-Ip和$X-Forwarded-For的区别

## \$X-Real-Ip和$X-Forwarded-For的区别 标签(空格分隔): nignx 负载均衡 client-ip --- ####1.如果只有一层代理,这两个头的值就是一样的####2.多层代理> * X-Forwarded-For:  header包含这样一行        `*X-Forwarded-For: 1.1.1.1, 2.2.2.2, 3.3.3.3*`> * X-Real-Ip:没有相关标准,上面的例子,如果配置了X-Read-IP,可能会有两种情况`// 最

C#中Convert和parse的区别

Convert.ToInt32()与int.Parse()的区别(1)这两个方法的最大不同是它们对null值的处理方法: Convert.ToInt32(null)会返回0而不会产生任何异常,但int.Parse(null)则会产生异常. 没搞清楚Convert.ToInt32和int.Parse()的细细微区别时千万别乱用,否则可能会产生无法预料的结果,举例来说:假如从url中取一个参数page的值,我们知道这个值是一个int,所以即可以用Convert.ToInt32(Request.Que

python判断字符串,str函数isdigit、isdecimal、isnumeric的区别

s为字符串s.isalnum() 所有字符都是数字或者字母s.isalpha() 所有字符都是字母s.isdigit() 所有字符都是数字s.islower() 所有字符都是小写s.isupper() 所有字符都是大写s.istitle() 所有单词都是首字母大写,像标题s.isspace() 所有字符都是空白字符.\t.\n.\r 判断是整数还是浮点数a=123b=123.123 >>>isinstance(a,int)True>>>isinstance(b,floa

java web 过滤器跟拦截器的区别和使用

1.首先要明确什么是拦截器.什么是过滤器 1.1 什么是拦截器: 拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作.拦截是AOP的一种实现策略. 在Webwork的中文文档的解释为--拦截器是动态拦截Action调用的对象.它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行.同时也是提供了一种可以提取action中可重用的部分的方式.

mysql中int、bigint、smallint和tinyint的区别与长度

对比发现 int bigint smallint 和 tinyint 类型,如果创建新表时没有指定 int(M) 中的M时,默认分别是 : int             -------     int(11) bigint       -------     bigint(20) smallint   -------     smallint(6) tinyint     -------     tinyint(4) 下面是这几种类型的取值范围 参考:http://www.2cto.com/d

call和apply和bind的区别

在 javascript 中,call 和 apply 都是为了改变某个函数运行时的上下文(context)而存在的,换句话说,就是为了改变函数体内部 this 的指向. JavaScript 的一大特点是,函数存在「定义时上下文」和「运行时上下文」以及「上下文是可以改变的」. apply(): 将函数作为指定对象的方法来调用,传递给它的是指定的参数数组function.apply(thisobj, args) 或者 function.apply(thisobj, args) 1.thisobj

mybatis中&quot;#&quot;和&quot;$&quot;的区别

mybatis中"#"和"$"的区别 动态 sql 是 mybatis 的主要特性之一,在 mapper 中定义的参数传到 xml 中之后,在查询之前 mybatis 会对其进行动态解析.mybatis 为我们提供了两种支持动态 sql 的语法:#{} 以及 ${}. 在下面的语句中,如果 username 的值为 zhangsan,则两种方式无任何区别: select * from user where name = #{name}; select * from

mybatis与hibernate的区别

本文转载自:http://blog.csdn.net/wangpeng047/article/details/17038659 以前没怎么用过mybatis,只知道与hibernate一样是个orm数据库框架.随着使用熟练度的增加,发现它与hibernate区别是非常大的,结合至今为止的经验,总结出以下几点: 1. hibernate是全自动,而mybatis是半自动. hibernate完全可以通过对象关系模型实现对数据库的操作,拥有完整的JavaBean对象与数据库的映射结构来自动生成sql

C++学习笔记----2.4 C++引用在本质上是什么,它和指针到底有什么区别

从概念上讲.指针从本质上讲就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变. 而引用是一个别名,它在逻辑上不是独立的,它的存在具有依附性,所以引用必须在一开始就被初始化,而且其引用的对象在其整个生命周期中是不能被改变的(自始至终只能依附于同一个变量). 在C++中,指针和引用经常用于函数的参数传递,然而,指针传递参数和引用传递参数是有本质上的不同的: 指针传递参数本质上是值传递的方式,它所传递的是一个地址值.值传递过程中,被调