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*)时,提取运算符“>>”是会跳过空白,读入后面的非空字符,直到遇到另一个空白字符为止,并在串尾放一个字符串结束标志‘\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'一样;
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\n",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 时发生访问冲突;不知什么原因?求助博友帮忙!
这是今天所讲的全部内容,谢谢关注!
C++对C语言的非面向对象特性扩充(1)的更多相关文章
- C++对C语言的非面向对象特性扩充(3)
今天要讲的是C++作用域运算符"::",强制类型转换的扩充,C++中相对于C中malloc和free函数的运算符new和delete,以及C++对C的一个重要扩充:引用(refer ...
- C++对C语言的非面向对象特性扩充(2)
上一篇随笔写了关于C++在注释,输入输出,局部变量说明的扩充,以及const修饰符与C中的#define的比较,也得到了几位学习C++朋友们的帮助讲解,十分感谢,我也希望欢迎有更多学习C++的朋友一起 ...
- Java语言中的面向对象特性总结
Java语言中的面向对象特性 (总结得不错) [课前思考] 1. 什么是对象?什么是类?什么是包?什么是接口?什么是内部类? 2. 面向对象编程的特性有哪三个?它们各自又有哪些特性? 3. 你知 ...
- Java语言中的面向对象特性:封装、继承、多态,面向对象的基本思想(总结得不错)
Java语言中的面向对象特性(总结得不错) [课前思考] 1. 什么是对象?什么是类?什么是包?什么是接口?什么是内部类? 2. 面向对象编程的特性有哪三个?它们各自又有哪些特性? 3. 你知道jav ...
- Java语言中的面向对象特性
面向对象的基本特征 1.封装性 封装性就是把对象的属性和服务结合成一个独立的相同单位,并尽可能隐蔽对象的内部细节,包含两个含义: ◇ 把对象的全部属性和全部服务结合在一起,形成一个不可分割的独立单位( ...
- javascript进阶——面向对象特性
面向对象的javascript是这门语言被设计出来时就考虑的问题,熟悉OOP编程的概念后,学习不同的语言都会发现不同语言的实现是不同的,javascript的面向对象特性与其他具有面向对象特性的语言的 ...
- Javascript面向对象特性实现封装、继承、接口详细案例——进级高手篇
Javascript面向对象特性实现(封装.继承.接口) Javascript作为弱类型语言,和Java.php等服务端脚本语言相比,拥有极强的灵活性.对于小型的web需求,在编写javascript ...
- java安全沙箱(三)之内置于Java虚拟机(及语言)的安全特性
java是一种类型安全的语言,它有四类称为安全沙箱机制的安全机制来保证语言的安全性,这四类安全沙箱分别是: 类加载体系 .class文件检验器 内置于Java虚拟机(及语言)的安全特性 安全管理器及J ...
- 浅谈Objective—C中的面向对象特性
Objective-C世界中的面向对象程序设计 面向对象称程序设计可能是现在最常用的程序设计模式.如何开发实际的程序是存在两个派系的-- 面向对象语言--在过去的几十年中,很多的面向对象语言被发明出来 ...
随机推荐
- MySQL 二进制日志过滤
binlog_do_db; binlog_ignore_db; 这个两个参数是用来控制对哪个数据库的更改要记录日志:下面以binlog_ignore_db为例子. 假如binlog_ignore_db ...
- 转:CI伪静态化
去掉php框架CI默认url中的index.php 2010-03-17 17:33:07| 分类: php框架ci |字号 订阅 CI默认的rewrite url中是类似这样的,例如你的CI根 ...
- ilmerge合并多个组件
原文 http://www.cnblogs.com/margiex/archive/2008/06/24/302329.html 年初的一篇文章中提到过一下: http://margiex.cnblo ...
- 窗函数的C语言实现
一般的讲数字信号处理的书中都会提到窗函数.大多数只会提及其中的几种.这里我把这些窗都用C语言实现了一下,都不复杂,但如果要自己去弄也挺费时间.所有函数都用Matlab验证了.包括以下窗: /*窗类型* ...
- DevExpress ASP.NET 使用经验谈(5)-通过ASPxGridView实现CRUD操作
这节,我们将通过使用DevExpress的ASPxGridView控件,实现对数据的CRUD操作. 首先,我们在解决方案中,添加一个网站: 图一 添加新网站 图二 添加DevExpress.Data. ...
- c/c++ double的数字 转成字符串后 可以有效的避免精度要求不高的数
char n[100]; sprintf(n,"%lf",db);
- Ubuntu Git安装
Git是一款免费.开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目.通过使用git工具,我们可以实现团队间合作开发统一管理,可以从远程仓库中提取代码,也可以把代码上传到远程仓库,从而实现 ...
- C++类包含问题(重复包含和相互包含)
一.重复包含头文件 头文件重复包含,可能会导致的错误包括:变量重定义,类型重定义及其他一些莫名其妙的错误.C++提供两种解决方案,分别是#ifndef和#pragma once #ifndef _SO ...
- Java 网络编程(五) 使用TCP/IP的套接字(Socket)进行通信
链接地址:http://www.cnblogs.com/mengdd/archive/2013/03/10/2952616.html 使用TCP/IP的套接字(Socket)进行通信 套接字Socke ...
- Java学习之equals和hashcode的关系
两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对? 答:不对,如果两个对象x和y满足x.equals(y) == true,它们的哈希码(has ...