粤嵌教你从C轻松到C++(一)

  摘要:粤嵌教育是专门从事产品研发的嵌入式培训基地,随着近年来嵌入式行业的火爆,越来越多的人投入嵌入式大军中,粤嵌教育也为社会输送了大量的嵌入式人才。众所周知,嵌入式的门栏比较高,需要一定的C语言基础,现在粤嵌从多方面带你各个击破,一步一步进入嵌入式大门。C++技术固然是很时髦的,许多C用户都想在尽可能短的时间内为自己贴上C++的标签。介绍C++的书很多,但只有那些已经侥幸入门的用户才偶尔去翻翻,仍有不少在C++门口徘徊的流浪汉。

  本文只针对C用户,最好是一位很不错的老用户(譬如他在遇到最简单的问题时都尝试着使用指针),通过一些C和更好的C++(本文用的是Borland C++3.1版本)例程介绍有关C++的一些知识,让读者朋友们浅入深出,轻轻松松C to C++!

  一、标签!标签!

  快快为你的程序贴上C++的标签,让你看起来很像个合格的C++用户……

  1.注释(comment)

  C++的注释允许采取两种形式。第一种是传统C采用的/**/,另一种新采用的则是//,它表示从//至行尾皆为注释部分。读者朋友完全可以通过//使你的代码带上C++的气息,如test0l: //test01.cpp

  #include

  //I'm a C++user!

  //…and C is out of date.

  void main()

  {

  cout<<"Hello world!n"; //prints a string

  }

  Hello-world!

  如果你尝试着在test0l. exe中找到这些高级的注释,很简单,它们不会在那里的。

  2. cincout

  你可能从test0l中嗅出什么味儿来了,在C++中,其次的贵族是cout,而不是很老土的printf ( )。左移操作符‘<<’的含义被重写,称作输出操作符插入操作符。你可以使用‘<<’将一大堆的数据像糖葫芦一样串起来,然后再用cout输出:

  cout << "ASCII code of "<< 'a' << " is:" <<97;

  ASCII code of a is:97

  如何来输出一个地址的值呢?C中可以通过格式控制符”%p”来实现,如:

  printf ("%p&i);

  类似地,C++也是这样:

  cout << & i;

  但对字符串就不同啦!因为:

  char * String="Waterloo Bridge";

  cout << String; //prints ‘Waterloo Bridge'

  只会输出String的内容。但方法还是有的,如采取强制类型转换:

  cout<<(void *)String;

  cin采取的操作符是’>>’,称作输入操作符提取操作符。在头文件iostream.h中有cin cout的原型定义,cin语句的书写格式与cout的完全一样:

  cin>>i; //ok

  cin>>&i; //error. Illegal structure operation

  看到了?别再傻傻地送一个scanf()常用的’&’地址符给它。

  C++另外提供了一个操纵算子endl,它的功能和’n’完全一样,如test0l中的cout语句可改版为:

  cout << ”Hello world!”<

  3.即时声明

  这是笔者杜撰的一个术语,它的原文为declarations mixed with statements,意即允许变量的声明与语句的混合使用。传统C程序提倡用户将声明和语句分开,如下形式:

  int i=100;

  float f; //declarations

  i++;

  f=1.0/i; //statements 而C++抛弃这点可读性,允许用户采取更自由的书写形式:  int i=100;

  i++;

  float f =1. 0/i;

  即时声明常见于for循环语句中: for(int i = 0; i < 16; i++)

  for(int j = 0; j < 16; j++)

  putpixel(j i Color[i][j]);

  这种形式允许在语句段中任点声明新的变量并不失时机地使用它(而不必在所有的声明结束之后)

  特别地,C++强化了数据类型的类概念,对于以上出现的“int i=1 j=2;”完全可以写成:int i(1) j (2);再如: char * Stringl("Youth Studio.”);

  char String2[]("Computer Fan.“);

  这不属于即时声明的范畴,但这些特性足以让你的代码与先前愚昧的C产品区别开来。

  4.作用域(scope)及其存取操作符(scope qualifier operator)

  即时声明使C语言的作用域的概念尤显重要,例如以下语句包含着一条错误,因为ch变量在if块外失去了作用域。  if(ok)

  char ch='!';

  else

  ch='?'; //error. access outside condition

  作用域对应于某一变量的生存周期,它通常表现为以下五种:

  块作用域

  开始于声明点,结束于块尾,块是由{}括起的一段区域

  函数作用域

  函数作用域只有语句标号,标号名可以和goto语句一起在函数体任何地方函数原型作用域

  在函数原型中的参量说明表中声明的标识符具有函数原型作用域

  文件作用域

  在所有块和类的外部声明的标识符(全局变量)具有文件作用域

  类作用域

  类的成员具有类作用域

  具有不同作用域的变量可以同名,如test02:

  //test02.cpp

  #include

  int i=0;

  void main()

  {

  cout << i << ' '; //global 'int i' visible

  {

  float i(0.01); //global 'int i' overrided

  cout<< i << ' ';

  }

  cout<

  }

  0 0.01 0

  编译器并未给出错误信息。

  作用域与可见性并不是同一概念,具有作用域不一定具有可见性,而具有可见性一定具有作用域。

  在test02中,float i的使用使全局int i失去可见性,这种情形被称作隐藏(override)。但这并不意味着int i失去了作用域,在main()函数运行过程中,int i始终存在。

  有一种办法来引用这丢了名份的全局i,即使用C++提供的作用域存取操作符::,它表示引用的变量具有文件作用域,如下例程:  //test03.cpp

  #include

  enum {boy girl};

  char i = boy;

  void main()

  {

  {

  float i(0.01);

  cout << "i=" << i << endl;

  ::i=girl; //modify global 'i'

  }

  cout << "I am a " << (i ? "girl." : "boy.");

  }

  i=0.01

  I am a girl.  在上例中,通过::操作符,第8行语句偷偷地改写了i所属的性别。更妙的是,::之前还可以加上某些类的名称,它表示引用的变量是该类的成员。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值