• C++对C语言的非面向对象特性扩充(1)


     我将分3篇来介绍C++相对于C在非对象特性上的扩充,今天要讲的是C++在注释,输入输出,局部变量说明的扩充,以及const修饰符与C中的#define的比较。

      1.C++注释除了包括原有C的块注释/*...*/,还提供了行注释//,另外要注意的是对于注释/*...*/的方式是不能嵌套的,比如/*C++/*C++*/C*/,这是不允许的。但是嵌套注释//是可以的。

      2.我想大家对于C的输入Printf和输出Scanf函数应该是在熟悉不过了,在C++中除了可以正常使用这两个函数外,又增加了标准输入流对象cin和标准输出流对象cout。但使用cin和cout进行输入输出更安全,方便。我用VC++写了一下printf和scanf函数,可以正常运行,但会报出警告:

    大概的意思是说scanf函数不安全,建议使用scanf_s代替,于是我用了scanf_s,结果警告就没有了!

      再来说说cin对象,它在程序中用于代表标准输入设备,比如键盘,它必须与运算符>>一起运用,即cin>>,而运算符“>>”仍保留了C中“右移”的功能,作为输入功能时,用于从对象cin读取数值传送给右方变量,比如int x;cin>>x;也可以连续输入一连串数据比如cin>>a>>b>>c;它会按顺序提取数据,存入对应变量,数据之间可以用空格、回车分隔。

      但是当输入的是字符串(即类型为char*)时,提取运算符“>>”是会跳过空白,读入后面的非空字符,直到遇到另一个空白字符为止,并在串尾放一个字符串结束标志‘’。因此输入字符串遇到空格时,就当作数据输入结束比如:

    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<<' ';结果和C#里的字符串相加一样的概念。其中C++中有一个操作符endl,它的作用与' '一样;

      3.简单说说C++局部变量,对于用过C#的人,不说也可以,举个例子:一个函数

    func()

    {

      int x;

      x=1;

      int y;

      y=2;

      ...

    }

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

      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有类型,占用存储单元,有地址,可以用指针指向它;

    const也可以与指针结合使用,看看这两条语句const char* str="c++"和char* const str="c++"有什么区别,一看好像没什么不同,其实他们的意义完全不一样,前一个str是指向字符串常量的普通指针变量,它不允许str指针所指的常量比如:str[2]=‘-';但是可允许改变它所指的地址,比如str="C--";对于第二种情况,则刚好相反,创建了一个常指针,即不能改变指针所指的地址,但可以改变数据,即str="C--"//不可以;str[2]='-';//可以。还有如果const定义的是一个整型常量,那么关键字int可省略;

      5.最后用一段程序来联系总结一下今天的内容(开发工具vs2010,VC++控制台程序):

    复制代码
    1 #include "stdafx.h"
    2 #include <iostream>
    3  #define PI 3.14;//C中定义常量
    4 usingnamespace std;
    5 /*C++在注释,输入输出,
    6 局部变量说明的扩充,以
    7 及const修饰符与C中的
    8 #define的比较*/
    9 int main()
    10 {
    11 int x;
    12 float y;
    13 //C和C++的输入输出的比较
    14 printf("scanf:请输入一个整数:");
    15 scanf_s("%d",&x);
    16 printf("prinf:所输入的整数:%d ",x);
    17 cout<<"cin:请输入一个整数,一个浮点数:";
    18 cin>>x>>y;
    19 cout<<"cout:输入的整数:"<<x<<"浮点数:"<<y<<endl;
    20 //C++中cin的一些注意点
    21 char*str=newchar[20];//局部变量说明
    22 cout<<"请输入一个字符串:";
    23 cin>>str;
    24 cout<<"所输入的字符串:"<<str<<endl;
    25 
    26 cout<<"请输入一个整数,一个浮点数:";
    27 cin>>x>>y;
    28 cout<<"输入的整数:"<<x<<"浮点数:"<<y<<endl;
    29 //const的运用
    30 constdouble pi=3.14;//或double const pi=3.14
    31 cout<<"#define:PI"<<PI;
    32 cout<<"const:pi"<<pi<<endl;
    33 
    34 //指向字符串常量的普通指针变量和常指针区别
    35 constchar*chr_0="C++";//普通指针
    36 //chr_0[2]='_';不允许
    37 chr_0="C--";
    38 cout<<"普通指针:"<<chr_0<<endl;
    39 
    40 char*const chr_1="C++";//常指针
    41 //chr_1="C--";//不允许
    42 chr_1[2]='-';
    43 cout<<"常指针:"<<chr_1<<endl;
    44 return0;
    45 }
    复制代码

    在运行中出现了两个问题,第一个如果把char *str=new char[20];改成char *str="";就会在运行中报错:0xC0000005: 写入位置 0x0041ba01 时发生访问冲突,第二个还没解决:char* const chr_1="C++";
     chr_1[2]='-';执行到这也报错0xC0000005: 写入位置 0x0041b976 时发生访问冲突;不知什么原因?求助博友帮忙!

    这是今天所讲的全部内容,谢谢关注!

    如果一件事情你觉得难的完不成,你可以把它分为若干步,并不断寻找合适的方法。最后你发现你会是个超人。不要给自己找麻烦,但遇到麻烦绝不怕,更不要退缩。 电工查找电路不通点的最快方法是:分段诊断排除,快速定位。你有什么启示吗? 求知若饥,虚心若愚。 当你对一个事情掌控不足的时候,你需要做的就是“梳理”,并制定相应的规章制度,并使资源各司其职。
  • 相关阅读:
    数据结构学习(十二)、归并排序
    数据结构学习(十一)、堆排序
    数据结构学习(十)、插入排序
    数据结构学习(九)、简单选择排序
    数据结构学习(八)、冒泡排序
    天梯赛 L3-013 非常弹的球 找规律
    codeup模拟赛 进击的二叉查找数
    POJ 2828 Buy Tickets 线段树 倒序插入 节点空位预留(思路巧妙)
    HDU 1394 逆序数 线段树单点跟新 | 暴力
    HDU 2795 Billboard 线段树,区间最大值,单点更新
  • 原文地址:https://www.cnblogs.com/wvqusrtg/p/4497453.html
Copyright © 2020-2023  润新知