往通俗点地说C/C++的不同之处(面对新手向)(2)

   看了下上个博客的内容,没想到很受欢迎,也有很多人评论,感谢大家的支持和点赞,我会坚持更,不会咕的,真的不会咕的……
在这里插入图片描述

1.常用函数的用法不同(扩展)

1.I/O函数和函数对象

cin&&scanf

   经过上一个博客之后大家都能了解到关于printf、scanf和cin、cout的较明显不同之处,那么在这篇,我再给大家继续加深对标准I/O函数和函数对象的了解。
   首先请大家看下面的代码,然后动手试试输入一个回车键看看有什么现象:

char a;
scanf("%c",&a);
printf("%c",a);//a输出一个回车键,当然你看不到,它这里是以字符显示,先转换字符,然后转换成转义字符,再执行转义字符,即a="\n"=下一行(不显示,光标直接跳到下一行,然后程序结束
printf("%d",(int)a);//a输出10,\n回车键的ASCII码是10,所以按照int类型输出的是10
char a;
cin>>a;//如果一开始输入回车就不显示,只有当你输入具体的字符才会显示……
cout<<a;//a不显示,一直回车也没反应

   这里大家可能就有点疑惑了,如果a输入的是回车键的ASCII码,也就是a='\n'的时候,scanf能读取,cin却无法读取,这是正常的现象,因为cin本身就忽略空格键,tab键和回车键等等,这是cin的本身缺陷之一,但走运的是,你可以用cin.get()获取空格,回车键。
   那么这里可能就有人问既然没法读取回车,但是cout会读取空白符从而结束cin啊,莫急,让我慢慢道来~
首先,我这里说的忽略可不跟按下回车结束的一个东西呢,这里是说cin会跳过空白符,也就是说,只要你一开始输入回车或者空格,cin都会当作无视,跳过他们,直至读取到实质的数字或者字符之类的……

cout&&printf

   讲解完cin之后,我们再讲讲cout这个函数对象。关于cout,许多人在用过C语言之后刚刚用cout会发现一片天堂(不是printf它不好,是cout太香了.jpg)
在这里插入图片描述
但用到后面你会发现cout实在是太智能了,有时候它错了,咱们可能还要纠正过来。比如说控制输出几位小数,或者说用浮点数输出,结果发现小数点之后的零被省略掉了……

double a=6.0;
cout<<a<<endl;//a输出的是6,而不是6.000000,因为cout会忽略有效数之后的0…
printf("%f",a);//输出的是6.000000因为%f默认输出6位小数

如果你要保留小数点,你可能要用到#include<iomanip>以及各种类的成员函数(比起printf,这个输入巨繁多是真的蛋疼)

double b=6.0000;//这里b是4个小数,并且都带0
cout<<setiosflags(ios_base::fixed)<<setprecision(3)<<b<<endl;//b输出的是6.000,保留三位小数
printf("%.3f",b);//c语言只需要在格式控制符前面加.3就可以控制保留3位小数

在这里插入图片描述
相比之下还是C语言的标准函数printf更温柔了点呢

2.I/O的快速读取和读出(总结)

   C语言的快速读取函数大全:getchar();getche();getch();getc();gets();fgets();fgetc;
   读出:putchar();putch();putc();puts();fputs();fputchar();fgetc;
   C++在C语言的基础上扩展的读取函数:getline();get();put();

2.格式的不同(扩展)

1.结构体

   大家都知道,声明一个结构体时候,都是这样的:

struct birthday
{
    int year;
    int month;
    int day;
};//不要忘记加引号

那么在定义一个结构体性变量上C语言和C++有什么区别:

struct birthday zhanggao;//C语言写法
birthday zhanggao;//C++写法,可兼用C语言写法

   是的,C++可以省略struct来定义一个结构体类型变量,也可以兼用C语言的写法,但谁不想少写呢?
注:C++中的结构体不是C中的结构体,而是被当成了来处理,保留struct关键字是为了兼容C语言。换句话说,你用class和struct都是差不多的,都是可以声明一个成员函数,C语言结构体无法声明一个函数。

2.类

   如果是学过C语言的伙伴们,应该知道结构体是什么,其实类跟结构体是差不多的,我给你举个例子:

class zhanggao//这是名叫zhanggao的类的声明
{
public://这是表明该数据成员、成员函数是对所有用户开放的,所有用户都可以直接进行调用
	int a;//这跟结构体非常相似,是定义一个int类型变量
	double b;
};

   大家可能对public这个非常陌生,莫慌,我给大家举个例子:
请想象你有一堆家人,那么家人之间肯定要有一定的信息交流和物质交换对吧,那么儿子只想分享给自己的大哥(喵喵喵,可能是?),不想给爸爸分享怎么办呢,只需要向家人声明下这个不给爸爸看,只给哥哥看,那么这里的public是什么意思呢,是所有人都可以用啦(是在这个类中的函数和子类的函数还有对象等等都可以用这里面的东东)
在这里插入图片描述
   经过这上面的例子我们不难知道public大概是什么了吧,public的实质就是作用域,只是他有权限控制别人的访问,不让别人借用什么的,像public的还有private/protected,他们的保密程度比public还高,基本上都不让别人借用什么的。
总结出来:

  1. public表明可被该类中的函数、子类的函数、朋友函数访问,也可以由该类的对象访问。
  2. private表示私有,私有的意思就是除了类自己之外,任何人都不可以直接使用,私有财产神圣不可侵犯嘛,即便是子女,朋友,都不可以使用。
  3. protected对于子女、朋友来说,就是public的,可以自由使用,没有任何限制,而对于其他的外部类,protected就变成private。

3.作用域的不同(难点)

1.命名空间作用域(名字空间域)

   其实命名空间的正式叫法应该是名字空间,而命名空间域的叫法是因为比较习惯,那么它到底是啥样子的?不妨用代码来看看它的本质:

namespace space;//这是叫space的命名空间
	char a[13]="hello,world!";//这就是命名空间作用域
cout<<space::a<<endl;//出来的是hello,world!

那么我们可以知道using namespace std;到底是啥玩意了,其实就是使用标准命名空间的声明,因为cin和cout都在std里面,如果要使用cin和cout都必须先声明using namespace std;才行哦

2.类作用域

   前面有讲到过C++中类和结构体很相似,其实这个说法也不是毫无力度,类确实可以看成一个特殊的结构体,只是多了成员函数、访问控制权限、继承、包含多态等面向对象(OOP)特性。可以说学会了类就是学会了C++的一小半,为什么说一小半,因为后面还有继承,多态和抽象数据等等,但学完类是真的占据了C++的一小半。

class 类名//这个看起来很像结构体,但比结构体多了很多的"功能"
{
public: //前面有介绍
	int a;//这些都是类作用域
	double b;//这也是类作用域部分
};

4.指针的区别

1.在可指向的范围的不同

   首先指针可以指向的范围有点不同,C++可以指向对象和引用,支持成员指针,包括成员变量指针和成员函数指针,而C语言没有,只能指向结构体、变量或函数,即C++中类成员指针等类型是C语言中所没有的。
关于引用这段实在太复杂,放到下次再讲(下次一定)
在这里插入图片描述

2.对空指针的定义不同

   在C语言中:#define NULL (void*)0
   在C++语言:#define NULL 0
   在这上面有类型上的区别就是定义上的不同,空指针就是指向0X0000这一零地址,不会伤害到重要内存部位,你可以想象下指针是一把枪,当你枪口瞄对靶子(内存单元的地址),目标就在靶子上,你可以按下枪的开关(*解引用符),然后得到了对应的目标(对应内存单元上的值),那么打完之后,你枪里面还有子弹,这时候应该由另一个选手上来了,而你应该还指向着已经更换过的靶子,这时候你不应该瞄准靶子,而是放下枪口,哪个靶子都不对准(指向了空),这就是空指针,保证了安全。
在这里插入图片描述

3.智能指针

   嘛,C语言和C++的指针其实还有更深的区别,就我个人而言是智能指针了(不强求看,量力而行)
   这个知识点不要太僵硬了,我们可以想象下这个智能指针是一个保姆,她要管理好多的资源宝宝,不让宝宝发生“内存泄漏”和“内存多次释放”的危险,那么智能指针肯定要有个工具(牛奶 )来管理资源宝宝吧?这个工具就是啦。她会通过这个“类”工具来实现宝宝放空自我(自动回收内存)。
如果你要通过new申请一些内存来存放数据,那么你肯定不得不在后面加个delete释放内存。但如果要使用智能指针的话,是可以大胆地放心申请内存,后面会帮你自动delete。
这是普通申请和释放内存的代码

类名 *p=new 类名(参数)//这里要申请一个类对象的堆内存
p->类中的一部分函数;//调用类里面的函数;
delete p;//释放内存

   不用纠结什么类不类的,只需要记住咱们申请了一部分内存就行
   然后再看用智能指针的代码

类指针 t = new 类名(20);
t->类中的一部分函数;

   这里不用写delete也是能实现释放内存效果,具体是怎么实现的是要看指针类的内容,不过这里也不好做解释。如果朋友们有兴趣,是可以CSDN里面搜索智能指针,非常多的,而且这里只讲解不同的地方,对后面的了解顺序也打个基础,而且C语言也不是没有智能指针,但实现方式是完全不一样的,是依靠编译器本身的。

发布了22 篇原创文章 · 获赞 159 · 访问量 9512

猜你喜欢

转载自blog.csdn.net/weixin_45677047/article/details/105087677