a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 158|回复: 4

[C++] 计算机等考二级C++辅导笔记:C++与C语言的区别

[复制链接]
发表于 2012-7-31 21:56:58 | 显示全部楼层 |阅读模式
 注明:以下及其后续内容部分摘自《Standard C++ Bible》,所有程序代码都在Visual Stdio 6.0中编译运行,操作系统为WinXP。本文不涉及VC6.0开发工具的使用,只讲解C++语法知识。  C++和C的共同部分就不讲解了(如 常量和变量,循环语句和循环控制,数组和指针等,这里面的一些区别会在本节和下节介绍一下),本文着重介绍C++的特点,如类、继承和多重继承、运算符重载、类模板、C++标准库、模板库、等等。8 _1 o( V( v# v
  一、C++概述
; Z% m0 ?7 ]8 S8 e  (一) 发展历史
8 V8 f+ y& O; w) M. e" [& S6 e  1980年,Bjarne Stroustrup博士开始着手创建一种模拟语言,能够具有面向对象的程序设计特色。在当时,面向对象编程还是一个比较新的理念,Stroustrup博士并不是从头开始设计新语言,而是在C语言的基础上进行创建。这就是C++语言。
! U: }" E* [0 X  1985年,C++开始在外面慢慢流行。经过多年的发展,C++已经有了多个版本。为次,ANSI和ISO的联合委员会于1989年着手为C++制定标准。1994年2月,该委员会出版了第一份非正式草案,1998年正式推出了C++的国际标准。
# Q. x! z, [6 a* s' z  D; r- M  (二) C和C+++ n# m) S! w( ~; s4 K8 p
  C++是C的超集,也可以说C是C++的子集,因为C先出现。按常理说,C++编译器能够编译任何C程序,但是C和C++还是有一些小差别。
: X7 t! X6 ~4 R  P  例如C++增加了C不具有的关键字。这些关键字能作为函数和变量的标识符在C程序中使用,尽管C++包含了所有的C,但显然没有任何C++编译器能编译这样的C程序。
7 |; Y; C$ J' n7 s/ }  C程序员可以省略函数原型,而C++不可以,一个不带参数的C函数原型必须把void写出来。而C++可以使用空参数列表。' f* ~( `5 B1 k: c# I8 G
  C++中new和delete是对内存分配的运算符,取代了C中的malloc和free。; B& x7 Q: Z+ ~9 H. e5 x% U
  标准C++中的字符串类取代了C标准C函数库头文件中的字符数组处理函数。
: g9 U5 \  Y0 |* k5 O  C++中用来做控制态输入输出的iostream类库替代了标准C中的stdio函数库。2 F! Y3 M! t6 Y& s! {/ W2 q
  C++中的try/catch/throw异常处理机制取代了标准C中的setjmp()和longjmp()函数。
7 v) y8 p1 A8 ]  二、关键字和变量
/ [- O, f! z$ P- d$ f( Y  C++相对与C增加了一些关键字,如下:8 Q, L( M: |/ {; X4 \1 f8 K- w
  typename bool dynamic_cast mutable namespace7 u7 l' H: H9 A2 r7 Z
  static_cast using catch explicit new3 q" D# r- h. X" A! y
  virtual operator false private template
& d' ~$ a+ _- }- i  volatile const protected this wchar_t
& e5 ?2 L& }/ H' L% q$ j$ `+ G  const_cast public throw friend true+ D( E9 \* p! q0 \) ^# e6 _* `
  reinterpret_cast try0 [- M1 |/ ?9 M  Z" w" T
  bitor xor_e and_eq compl or_eq0 R# H" @/ V7 I9 Y
  not_eq bitand
回复

使用道具 举报

 楼主| 发表于 2012-7-31 21:56:59 | 显示全部楼层

计算机等考二级C++辅导笔记:C++与C语言的区别

 在C++中还增加了bool型变量和wchar_t型变量:  布尔型变量是有两种逻辑状态的变量,它包含两个值:真和假。如果在表达式中使用了布尔型变量,那么将根据变量值的真假而赋予整型值1或0。要把一个整型变量转换成布尔型变量,如果整型值为0,则其布尔型值为假;反之如果整型值为非0,则其布尔型值为真。布儿型变量在运行时通常用做标志,比如进行逻辑测试以改变程序流程。4 ]/ v& ^) D, X6 P4 B
  #include iostream.h
* I2 C6 U7 m$ u  int main()
. m0 l  W0 b/ Q1 o' h! j  {
: i$ Y0 @4 B) K) R- B3 n  bool flag;
& H  ]; {: n, G! _( j  flag=true;
! F( I  g4 b" C  if(flag) cout< return 0;
$ r7 U8 l2 `# F4 ~" {  }
# Y! }0 A: {! l; N  C++中还包括wchar_t数据类型,wchar_t也是字符类型,但是是那些宽度超过8位的数据类型。许多外文字符集所含的数目超过256个,char字符类型无法完全囊括。wchar_t数据类型一般为16位。
7 z0 K3 H  P- }0 o& D5 l8 M. Z  F  标准C++的iostream类库中包括了可以支持宽字符的类和对象。用wout替代cout即可。* k& f9 z, `  F$ J+ a) @9 r
  #include iostream.h/ _" c7 x" g7 _
  int main()4 S3 T$ k9 Y1 b$ S. ~0 B) T
  {( _, n7 x. `8 V- z. g) V
  wchar_t wc;2 }" z; k: Z3 a3 A& P0 o# I9 O
  wc='b';
& }6 y* e, O4 g% {/ t8 O5 h8 g6 y  wout< wc='y';
# ]. i' K6 `' x5 R* q/ q, T  wout< wc='e';
( {" s6 w5 S; ^* V$ Q  wout< return 0;
: ~# _1 j  r6 Z( ]# U7 Q  }1 p2 N6 }& L. h- K" w& i) R
  说明一下:某些编译器无法编译该程序(不支持该数据类型)。5 @( z3 M! d! F6 k$ f# O
  三、强制类型转换1 T6 _& A, @8 j: ]* C& d
  有时候,根据表达式的需要,某个数据需要被当成另外的数据类型来处理,这时,就需要强制编译器把变量或常数由声明时的类型转换成需要的类型。为此,就要使用强制类型转换说明,格式如下:" e) ]! ?+ w& ]* P) G: Z5 I+ P7 K
  int* iptr=(int*) &table;5 x5 U' D0 g7 \3 F% O6 `
  表达式的前缀(int*)就是传统C风格的强制类型转换说明(typecast),又可称为强制转换说明(cast)。强制转换说明告诉编译器把表达式转换成指定的类型。有些情况下强制转换是禁用的,例如不能把一个结构类型转换成其他任何类型。数字类型和数字类型、指针和指针之间可以相互转换。当然,数字类型和指针类型也可以相互转换,但通常认为这样做是不安全而且也是没必要的。强制类型转换可以避免编译器的警告。
7 X! T" }/ J5 F; l  b- P  long int el=123;
/ c: j5 i5 g4 P) M  u  short i=(int) el;6 N/ c1 N2 _$ n6 p* n7 ?2 J6 f
  float m=34.56;" Q; Z" A9 f; c1 [9 n$ @: y
  int i=(int) m;6 A5 _- n, m9 X! V8 }
  上面两个都是C风格的强制类型转换,C++还增加了一种转换方式,比较一下上面和下面这个书写方式的不同:
8 V, N4 U( P8 v+ o3 a% A: b3 Y  long int el=123;4 B1 t, {5 y; P! \2 h' l1 O6 Y
  short i=int (el);+ t4 t8 e+ x4 a
  float m=34.56;# I% N  Y0 z4 U1 \. R6 M+ Q
  int i=int (m);8 i  o" ~2 s+ a+ m1 T4 v" N
  使用强制类型转换的最大好处就是:禁止编译器对你故意去做的事发出警告。但是,利用强制类型转换说明使得编译器的类型检查机制失效,这不是明智的选择。通常,是不提倡进行强制类型转换的。除非不可避免,如要调用malloc()函数时要用的void型指针转换成指定类型指针。0 ?5 b9 u7 J+ O- M% T
  四、标准输入输出流
# I# `3 U2 W& E7 X  在C语言中,输入输出是使用语句scanf()和printf()来实现的,而C++中是使用类来实现的。9 \  c9 U3 X1 S9 t7 z& k5 D
  #include iostream.h
* _2 c$ f: B* {4 T& r! {3 f  main() //C++中main()函数默认为int型,而C语言中默认为void型。" \1 ~# |2 s* T7 ]- S8 a
  {
1 `& E! g1 T# Z7 z) R9 i  int a;
# V- f9 r/ {% u% Z3 S  cout< cin>>a; /*输入一个数值*/
  _# v; D# m6 l* ?  cout< return 0;4 S, r+ a$ ^6 Z$ h) o) M6 {
  }
+ f- J0 l! Y" o; j) I' ?0 z  cin,cout,endl对象,他们本身并不是C++语言的组成部分。虽然他们已经是ANSI标准C++中被定义,但是他们不是语言的内在组成部分。在C++中不提供内在的输入输出运算符,这与其他语言是不同的。输入和输出是通过C++类来实现的,cin和cout是这些类的实例,他们是在C++语言的外部实现。
! C6 a+ F* g) a, }) \  在C++语言中,有了一种新的注释方法,就是‘//’,在该行//后的所有说明都被编译器认为是注释,这种注释不能换行。C++中仍然保留了传统C语言的注释风格/*……*/。+ O9 Q, t+ e/ p( W, e
  C++也可采用格式化输出的方法:
+ u6 c: K. i5 O) j) g3 V  #include iostream.h
8 u6 n6 |$ b: O! o) `6 v% `1 z7 {  int main()" b! }; A# O/ k% ]4 D$ }
  {
& N# b8 G; G0 V, r% H* M( D, ?+ @4 r  int a;
1 Q' M* s  A" Q, I  cout< cin>>a;
6 f' W9 I/ h2 m$ ^4 o3 B/ b! i) Y" w4 z( j8 O5 o, c
  cout
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-31 21:57:00 | 显示全部楼层

计算机等考二级C++辅导笔记:C++与C语言的区别

 五、函数重载  在C++中,允许有相同的函数名,不过它们的参数类型不能完全相同,这样这些函数就可以相互区别开来。而这在C语言中是不允许的。6 h" k$ E) |' i6 s$ f' M- O
  1.参数个数不同* F& |: P! w$ [
  #include iostream.h
# }6 n' x: w" y( h" T* O9 c  void a(int,int);
# T) w  x  ?3 s* A+ F: t  void a(int);' T$ |9 ~1 q: x5 U3 r+ b+ g
  int main()# x$ @9 G) k' h
  {
# [! B; X7 h& x. y% Q. W  a(5);
- M* r, q  V: T7 O+ I! G& v2 i4 v% {  a(6,7);4 P6 A2 B' V) Z# W' [
  return 0;! L7 w7 b) h8 |. n5 i. C: `
  }
( q0 v9 R& J7 ]: v# Y" K  void a(int i)
+ @1 \; Q9 S- I, W  {
$ _% {( h4 K/ |" E  cout< }& s( p; w% L. F" z0 }" h$ y& L! k7 s
  void a(int i,int j)& _+ F: K% Y, ~% U" g# o" U- k
  {
# X% D% r& r+ }. [. ^% n  cout< }
% O* m) m8 l; l# x; C$ Q* s  2.参数格式不同7 }# c5 s% g4 T  M+ L6 T/ N4 O
  #include iostream.h* M. r" B" }, \, d
  void a(int,int);
9 v: w2 K' n2 j# E  void a(int,float);9 r$ a$ W8 m! W6 h; E/ w7 Y
  int main()
3 b3 Q; P( h9 \6 f- B  {
) T7 W3 g. |" s. c9 C0 P0 f) H: @  a(5,6);
3 p% q" Y! V; H; n' x  a(6,7.0);/ i) v" e  v' V$ d/ g# j$ w
  return 0;& P+ H: K* L/ M. B% I: X& d8 Y
  }
( ]% J  o% l3 L  void a(int i,int j)
/ L8 V# E3 A$ ~* u  {5 H. u4 ?- ~# w: h
  cout< }- ^0 W, K3 }+ J6 ?
  void a(int i,float j)
; X: Z9 y$ V6 r! {! D  {# N; \% j+ t2 o- V% F" h
  cout< }. p! i# k) a! H$ _5 {2 }& d
  六、变量作用域
: d2 B2 W. {: B$ v6 D8 t4 K  C++语言中,允许变量定义语句在程序中的任何地方,只要在是使用它之前就可以;而C语言中,必须要在函数开头部分。而且C++允许重复定义变量,C语言也是做不到这一点的。看下面的程序:2 {% @6 G0 u6 t$ S
  #include iostream.h
) M. V+ L2 Z# U. v4 D: V  int a;; O2 N/ q9 `. o
  int main()1 ?4 j; [" c" {4 t7 ^- t
  {
- P* v8 \- N& @+ \, o' r# ^  cin>>a;/ x) ?, f2 \7 }

* b9 m8 P$ n) `0 Y; |/ v3 W/ O0 N  for(int i=1;i
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-31 21:57:01 | 显示全部楼层

计算机等考二级C++辅导笔记:C++与C语言的区别

七、new和delete运算符  在C++语言中,仍然支持malloc()和free()来分配和释放内存,同时增加了new和delete来管理内存。
: j( v! f8 M4 F& e  ]% u5 j! p  1.为固定大小的数组分配内存
8 u& H3 b( s* c+ D9 l8 w- m  #include iostream.h
9 v- I, O5 q9 m( H  int main()
0 u- G& M3 R9 N+ p5 \% v2 W$ T  {
0 I' M- ~' Z+ d9 F& \- C5 e  int *birthday=new int[3];
1 {# ^; n# c, {' v% W  birthday[0]=6;
: U3 d; z! x( l' X" z( J  birthday[1]=24;
! y) Q4 Z1 M; I+ S  ?  birthday[2]=1940;
  k, s" r# V3 _  cout< < delete [] birthday; //注意这儿
5 s& P0 O' O* ^0 \7 r  return 0;% }8 S; _0 Q7 U, o
  }, N1 s9 @. L, |6 V1 p1 w  I
  在删除数组时,delete运算符后要有一对方括号。7 X- E. Z; n: E# k
  2.为动态数组分配内存$ m1 h0 y, `. `* `; |! {
  #include iostream.h
5 a1 p) Q7 Y$ c: b) u3 n  U( x! C  #include stdlib.h) t6 _) x: Y" c( D8 U+ e& @/ ^# ~6 P, ~
  int main()0 L$ z* B. R; T% K; K
  {
6 \2 [7 a  z' o# U  int size;( j1 c$ o1 w0 d3 ~
  cin>>size;
% Y' {! f: h4 j5 u, [1 ]8 `5 B  int *array=new int[size];
. b9 y! _! w: \1 N, V  for(int i=0;i array=rand();7 p7 |2 n* z" N. ^0 p  p9 r
9 T8 O4 G4 F2 n9 ?* V9 ^) I" B3 |% \
  for(i=0;i cout
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-31 21:57:02 | 显示全部楼层

计算机等考二级C++辅导笔记:C++与C语言的区别

4.以引用方式调用  当函数把引用作为参数传递给另一个函数时,被调用函数将直接对参数在调用者中的拷贝进行操作,而不是产生一个局部的拷贝(传递变量本身是这样的)。这就称为以引用方式调用。把参数的值传递到被调用函数内部的拷贝中则称为以传值方式调用。
. v. W2 B# i9 q! Q7 R& h" s2 e  #include iostream.h
, n4 y9 g1 `1 s7 v. y# [  void display(const Date&,const char*);
0 H7 _5 _: A% c7 N5 n2 X  void swapper(Date&,Date&);
, H; |3 F1 x! G" a& z2 \5 i; _5 }! s  struct Date. e8 D) C0 X( x; a
  {
1 R0 \0 @0 L' \, j0 x  int month,day,year;
. |- O2 K1 i2 C# m7 ?$ ?  m  };
2 {4 F" g+ X2 d. n  int main()
2 ?+ `" I4 g1 q! R: g  {
8 \3 ]& T  p% o" g1 r5 r* t  static Date now={2,23,90};
" O" k$ h! L  _# m0 `  static Date then={9,10,60};9 D( G# g2 t9 b; V% w" e# B
  display(now,Now: );5 z6 `( R9 l1 Z, h- X; ?
  display(then,Then: );
4 G" O8 s- h6 y6 f  swapper(now,then);, s  C7 l: M3 s% s9 X# C
  display(now,Now: );- o5 V! X: L6 j/ r9 ~
  display(then,Then: );; ]' c4 d# R; P
  return 0;
% Z; E& s3 v3 S5 v0 }: D  }
& X6 G% W6 H( \/ U  void swapper(Date& dt1,Date& dt2)0 P  _, p; x+ [3 X$ m+ ~
  {
7 A  J# t( d) o# M3 p5 {& m+ R3 [8 m  Date save;
8 E8 T" D: M0 l: c& _# B  save=dt1;/ z7 Y" {* [; W0 [- {0 {
  dt1=dt2;9 d" Q! q& b( I
  dt2=save;3 e4 ~5 v, X, {/ n
  }5 u( p9 [; x/ \( v
  void display(const Date& dt,const char *s)
0 b, q9 _1 ~* g' m$ G+ l8 U5 J( A* t  {! d0 q7 J  S# d) k9 T6 h
  cout< cout< }
( ]9 c+ m: H1 U8 B. f  H# V  5.以引用作为返回值/ D7 M  t' q. Z' i  a( ~
  #include iostream.h5 n$ M+ k# l& O7 ~: l9 J0 x! J
  struct Date. _8 v) Y) `( \$ ~
  {; M6 I0 ~, r( X: g: }' y
  int month,day,year;+ I3 T7 R. T- \3 i* T
  };  ?' L5 ^$ N" @! `* ?/ q; F( T
  Date birthdays[]=
, u9 }& x& b. L, g  {. e' p/ g, S' v4 K  v' u/ Q: `* v
  {12,12,60};
/ ^# n: b8 o1 x  n; f4 C& M  {10,25,85};& V# w; x6 t- e7 [6 J2 M/ @+ y) T
  {5,20,73};
; x$ T8 o+ o% x3 S+ O  b* F" u  };% [* T/ ~- u7 w4 n* c$ }
  const Date& getdate(int n)6 P( l; M, r0 t; _% s+ ^) g
  {
; h2 [1 T1 a9 I7 @. O7 P  return birthdays[n-1];1 X' y6 ]% X4 R5 i  ~3 M1 `
  }  y5 B/ J; O/ S/ W
  int main()/ r; n, g( Z; d
  {
( q% H' o; V* e7 y3 G$ G  int dt=1;
& \' _, m7 c3 D6 g7 ~) |5 M: L( g' @  while(dt!=0)1 v& X: g# W* `3 e1 h
  {
; L. f6 ?! b: R6 T  cout< cin>>dt;0 w: J3 p- Z+ z: F% ~; b

& o* s$ I: t! S" ?! I. k  if(dt>0 && dt
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-22 17:41 , Processed in 0.257589 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表