C++对C语言的非面向对象特性扩充(1)-- 注释、输入输出、局部变量说明、C++中const修饰符与C中的#define

本文深入探讨了C++的注释、输入输出、局部变量声明、const修饰符与C中的#define宏定义的区别等内容。通过示例代码,展示了cin、cout与传统C语言输入输出函数的不同之处,以及const修饰符在多种场景下的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C++在注释、输入输出、局部变量说明的扩充、C++中const修饰符与C中的#define的比较。

第二章 C++对C语言的非面向对象特性扩充(1)-- 注释、输入输出、局部变量说明、C++中const修饰符与C中的define - tonylau2010 - Tonylau2010的博客1.C++注释除了包括原有C的块注释/*...*/,还提供了行注释//,

   另外要注意的是对于注释/*...*/的方式是不能嵌套的,比如/*C++/*C++*/C*/,这是不允许的。

   但是嵌套注释//是可以的。

第二章 C++对C语言的非面向对象特性扩充(1)-- 注释、输入输出、局部变量说明、C++中const修饰符与C中的define - tonylau2010 - Tonylau2010的博客2.C++中除了可以正常使用printf和scanf函数两个函数外,又增加了标准输入流对象cin和标准输出流对象cout。

   但使用cin和cout进行输入输出更安全,方便。

  先说说cin对象,它在程序中用于代表标准输入设备,比如键盘,它必须与运算符>>一起运用,即cin>>,

                 而运算符“>>”仍保留了C中“右移”的功能,

                 比如int x;cin>>x;也可以连续输入一连串数据比如cin>>a>>b>>c;

                它会按顺序提取数据,存入对应变量,数据之间可以用空格、回车分隔。

   再比如,当输入的是字符串(即类型为char*)时,提取运算符“>>”是会跳过空白,

         读入后面的非空字符,直到遇到另一个空白字符为止,并在串尾放一个字符串结束标志‘\0’。

          char* str; cin>>str;假如从键盘上输入的是C++C++ CC!

          则输入后str的值为C++C++,后面的CC!被忽略了。

          另一种情况是要检查输入数据与变量的匹配情况比如:

               int x;float y;

              cin>>x>>y;

              假如从键盘上输入的是88.88 99.99

              那么结果并非是预想的i=88 y=99.99,而是i=88 y=0.88,

              原因系统是根据变量的类型来分隔输入的数据,

              对于上述这种情况,系统把小数点前面的部分给了x,把剩下的0.88给了y;

对于cout对象就不详细说了,和cin差不多,要说的是像double a=3.1415926;cout<<"PI="<<a<<'\n';

结果和C#里的字符串相加一样的概念。其中C++中有一个操作符endl,它的作用与'\n'一样;

第二章 C++对C语言的非面向对象特性扩充(1)-- 注释、输入输出、局部变量说明、C++中const修饰符与C中的define - tonylau2010 - Tonylau2010的博客3.简单说说C++局部变量,对于用过C#的人,不说也可以,

举个例子:一个函数

func()

{

  int x;

  x=1;

  int y;

  y=2;

  ...

}

这个函数在C中是不允许的,在编译时出错,并终止编译,但在C++中是正确的,变量的声明可以和执行语句交替出现,只不过有效作用是有范围限制的,但无论怎么样都要符合“先定义,再使用的原则”;

第二章 C++对C语言的非面向对象特性扩充(1)-- 注释、输入输出、局部变量说明、C++中const修饰符与C中的define - tonylau2010 - Tonylau2010的博客4.做一下const修饰符和C中#define的比较,

在C中,用#define来定义常量如:#define PI 3.14;程序与编译时标识符PI被全部置换为3.14.在预编译后,程序中不再出现PI这个标识符,PI不是变量,没有类型,不占存储单元,且易出错;

而C++则用Const来修饰常量

如:const double PI=3.14或double const PI=3.14

两者相同,这时PI有类型,占用存储单元,有地址,可以用指针指向它;

虽然他们在使用中感觉“差不多”,但是他们在实现上有什么区别?

请看下面的代码:

#define T 13 /*用#define定义的一个常量T*/

int main()

{

    const int t=13;/*用const定义的一个常量*/

    int n=t;/*把t赋值给n*/

    int m=T;/*把T赋值给m*/

}

(1).差别:

const与#define最大的差别在于:前者在堆栈分配了空间,而后者只是把具体数值直接传递到目标变量罢了。或者说,const的常量是一个Run-Time的概念,他在程序中确确实实的存在可以被调用、传递。而#define常量则是一个Compile-Time概念,它的生命周期止于编译期:在实际程序中他只是一个常数、一个命令中的参数,没有实际的存在。

const常量存在于程序的数据段.

#define常量存在于程序的代码段。

(2)优缺点:

至于两者的优缺点,要看具体的情况了。一般的常数应用,我个人认为#define是一个更好的选择:

i.从run-time的角度来看,他在空间上和时间上都有很好优势。

ii.从compile-time的角度来看,类似m=t*10的代码不会被编译器优化,t*10的操作需要在run-time执行。而#define的常量会被合并。

但是:如果你需要粗鲁的修改常数的值,那就的使用const了,因为后者在程序中没有实际的存在.

另外在头文件中使用 #define  可以避免头文件重复包含的问题,这个功能,是const无法取代的。

ps:C++中const用法总结---refer:http://www.cppblog.com/jukevin/archive/2008/12/27/70499.html

http://blog.youkuaiyun.com/Eric_Jo/article/details/4138548

引言:(继续-const-与指针-的进一步认识,参见另一篇文章"重拾-----const与指针(原创)")

沿着*号划一条线,

常量指针======

如果const位于*的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;---指针可变,指针指向内容不可变--

指针常量=====

如果const位于*的右侧,const就是修饰指针本身,即指针本身是常量;---指针不可变,指针指向的内容可变

1.const修饰普通变量和指针

(1).const修饰变量,一般有两种写法:

const TYPE value;

TYPE const value;

这两种写法在本质上是一样的。它的含义是:const修饰的类型为TYPE的变量value是不可变的。

(1).对于一个非指针的类型TYPE,无论怎么写,都是一个含义,即value只不可变。

例如:

const int nValue;         //nValue是const

int const nValue;    // nValue是const

(2).但是对于指针类型的TYPE,不同的写法会有不同情况,例如:

A. const char *pContent;

B. char * const pContent;

C. char const *pContent;

D. const char* const pContent;

 

对于前三种写法,我们可以换个方式,给其加上括号

A. const (char) *pContent;

B. (char*) const pContent;

C. (char) const *pContent;

这样就一目了然。根据对于const修饰非指针变量的规则,很明显,A=C.

 

- 对于A,C, const修饰的类型为char的变量*pContent为常量,因此,pContent的内容为常量不可变.

- 对于B, 其实还有一种写法: const (char*) pContent;

含义为:const修饰的类型为char*的变量pContent为常量,因此,pContent指针本身为常量不可变.

- 对于D, 其实是A和B的混合体,表示指针本身和指针内容两者皆为常量不可变

 

总结:

(1)  指针本身是常量不可变

(char*) const pContent;

const (char*) pContent;

 

(2)  指针所指向的内容是常量不可变

const (char) *pContent;

(char) const *pContent;

 

(3)  两者都不可变

const char* const pContent;

 

还有其中区别方法:

沿着*号划一条线,

如果const位于*的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;

如果const位于*的右侧,const就是修饰指针本身,即指针本身是常量。

2. const修饰函数参数

const修饰函数参数是它最广泛的一种用途,它表示函数体中不能修改参数的值(包括参数本身的值或者参数其中包含的值)。它可以很好

void function(const int Var); //传递过来的参数在函数内不可以改变(无意义,因为Var本身就是形参)

void function(const char* Var); //参数指针所指内容为常量不可变

void function(char* const Var); //参数指针本身为常量不可变(也无意义, 因为char* Var也是形参)

 

参数为引用,为了增加效率同时防止修改。

修饰引用参数时:

void function(const Class& Var);//引用参数在函数内不可以改变

void function(const TYPE& Var); //引用参数在函数内为常量不可变

 

3. const 修饰函数返回值

const修饰函数返回值其实用的并不是很多,它的含义和const修饰普通变量以及指针的含义基本相同。

(1) const int fun1() 这个其实无意义,因为参数返回本身就是赋值。

(2) const int * fun2()

调用时 const int *pValue = fun2();

我们可以把fun2()看作成一个变量,那么就是我们上面所说的1.(1)的写法,即指针内容不可变。

(3) int* const fun3()

调用时 int * const pValue = fun2();

我们可以把fun2()看作成一个变量,那么就是我们上面所说的1.(2)的写法,即指针本身不可变。

4. const修饰类对象/对象指针/对象引用

const修饰类对象表示该对象为常量对象,其中的任何成员都不能被修改。对于对象指针和对象引用也是一样。

const修饰的对象,该对象的任何非const成员函数都不能被调用,因为任何非const成员函数会有修改成员变量的企图。

例如:

class AAA

{
   void func1();

void func2() const;

}

const AAA aObj;

aObj.func1(); ×

aObj.func2(); 正确

 

const AAA* aObj = new AAA();

aObj->func1(); ×

aObj->func2(); 正确

 

5. const修饰成员变量

const修饰类的成员函数,表示成员常量,不能被修改,同时它只能在初始化列表中赋值。

 

class A

{

   …

   const int nValue;       //成员常量不能被修改

   …

   A(int x): nValue(x) {}; //只能在初始化列表中赋值

}

 

6. const修饰成员函数

const修饰类的成员函数,则该成员函数不能修改类中任何非const成员函数。一般写在函数的最后来修饰。

 

class A

{

   …

void function()const; //常成员函数, 它不改变对象的成员变量. 也不能调用类中任何非const成员函数。

}

对于const类对象/指针/引用,只能调用类的const成员函数,因此,const修饰成员函数的最重要作用就是限制对于const对象的使用。

 

 

  第二章 C++对C语言的非面向对象特性扩充(1)-- 注释、输入输出、局部变量说明、C++中const修饰符与C中的define - tonylau2010 - Tonylau2010的博客5.最后用一段程序来联系总结一下今天的内容(开发工具vs2010,VC++控制台程序):

#include "stdafx.h"
 #include <iostream>
  #define PI 3.14;//C中定义常量
 usingnamespace std;
 /*C++在注释,输入输出,
 局部变量说明的扩充,以
 及const修饰符与C中的
 #define的比较*/
 int main()
 {
 int x;
 float y;
 //C和C++的输入输出的比较
 printf("scanf:请输入一个整数:");
 scanf_s("%d",&x);
 printf("prinf:所输入的整数:%d\n",x);
 cout<<"cin:请输入一个整数,一个浮点数:";
 cin>>x>>y;
 cout<<"cout:输入的整数:"<<x<<"浮点数:"<<y<<endl;
 //C++中cin的一些注意点
 char*str=newchar[20];//局部变量说明
 cout<<"请输入一个字符串:";
 cin>>str;
 cout<<"所输入的字符串:"<<str<<endl;
 
 cout<<"请输入一个整数,一个浮点数:";
 cin>>x>>y;
 cout<<"输入的整数:"<<x<<"浮点数:"<<y<<endl;
 //const的运用
 constdouble pi=3.14;//或double const pi=3.14
 cout<<"#define:PI"<<PI;
 cout<<"const:pi"<<pi<<endl;
 
 //指向字符串常量的普通指针变量和常指针区别
 constchar*chr_0="C++";//普通指针
 //chr_0[2]='_';不允许
 chr_0="C--";
 cout<<"普通指针:"<<chr_0<<endl;
 
 char*const chr_1="C++";//常指针
 //chr_1="C--";//不允许
 chr_1[2]='-';
 cout<<"常指针:"<<chr_1<<endl;
 return0;
 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值