c++学习之c++对c的扩展1

news/2024/5/19 22:03:35/文章来源:https://blog.csdn.net/qq_61422622/article/details/130065724

目录

1.面向过程与面向对象的编程

2.面向对象编程的三大特点

3.c++对c的扩展:

1.作用域运算符::

2.命名空间

1.c++命名空间(namespace)

2.命名空间的使用

1.在不同命名空间内可以创建相同的名称

2.命名空间只能在全局范围内定义

 3.命名空间可以嵌套

4.命名空间是开放的,可以随时定义新成员到空间中。

5.声明和实现可分离

6.无名的命名空间

7.命名空间别名

3.using声明 命名中的空间成员 可用

using声明成员碰到函数重载

4.C++中形参必须有类型,返回值和实参个数做检测

5.更严格的类型转换

6.结构体增强

在结构体中定义函数

7:新增bool类型关键字

8.三目运算符功能增强


1.面向过程与面向对象的编程

什么是面向过程编辑呢?

举一个例子,我们去实现玩一个下棋游戏的项目,那么我们需要对下棋的所有功能进行实现,从游戏角色,进入游戏,游戏游玩,游戏输赢的判断,退出游戏等所有的过程我们都需要一步步实现。我们需要去分析每一步是如何实现的,这个过程就是面向过程的编译。

那什么是面向对象编程?

面向对象是相对于面向过程一步步实现的特点,面向对象更倾向于模块化的实现,对于’’对象‘‘,是系统中用来描述客观事物的一个实体,它是用来构成系统的一个基本单位,对象是由一组属性与一组行为构成的。

对象: 世界上任何的事物都可以被抽象成一个对象(属性 +行为)。对于一个下棋游戏,他的属性就是有棋盘,棋子加判断游戏输赢的功能的这样的行为。

2.面向对象编程的三大特点

封装 将属性和方法封装在一起抽象成一个类 并且对类中的成员加以权限控制
继承 将一个类中属性和方法继承到另一个类中
多态   一个接口 对种形态 (静态多态 动态多态)
面向对象编程相对于面向过程编程,更加模块化,是结构化程序因此能有效的将一个都咋的程序设计任务分解成许多易于控制的和处理的子任务,便于开发与维护。

3.c++对c的扩展:

在此之前我们先提一个在C++比较重要的运算符 

1.作用域运算符::

:: 运算符前代表的是一个作用域  。
它的作用是解决归属问题(谁是属于谁的谁),A::变量B,B是来自A的一个变量。
 如果::前面什么都没有加 代表是全局作用域,则可以将该变量转化为全局变量。
比如:
#include <iostream>
using namespace std;int a = 100;
void test01(){
int a = 10;
cout << a << endl;//输出局部变量acout << ::a << endl;//输出全局变量a}int main(){test01();return 0;}

可以看到这里的::a是一个全局变量了。

2.命名空间

创建名字是程序设计中一项基本的活动,当一个项目很大时,他会不可避免地包含大量名字,c++允许我们对名字的产生和名字的可见性进行控制。我们之前学习c语言可以通过static静态修饰全局变量使丢掉了外部连接属性,只对内部产生作用,在c++中我们可以定义一个作用域来控制对名字的访问。

1.c++命名空间(namespace)

在c++中,名称可以是符号常量,变量,函数,结构,枚举,类和对象等等。我们所创建的工程越大,名字的访问就越有可能发生冲突,其次在使用多个厂商的类库时,也可能会名字冲突。为了避免这样的冲突,引入关键字namespace给出作用空间,能更好的使用名称。

利用namespace我么们可以定义一片区间,其本质是作用域,为的是可以更好的控制标识符的作用域,其次编译器能通过空间名能快速地找到该数据。

命名空间之后 就可以存放 变量 函数 类 结构体 ...各种数据。

2.命名空间的使用

namespace  空间名称           

{

    存放在该空间的各种数据

}    

其次命名空间是有许多特点的:

1.在不同命名空间内可以创建相同的名称

举一个实例,创建两个命名空间 A B分别在里面创建一个名字相同变量,计算机仍可以识别。

#include<iostream>
using  namespace std;
namespace A
{int a = 10;
}
namespace B {int a = 20;
}
void test()cout << "A::a :" << A::a << endl;//10cout << "B::a :" << B::a << endl;//20
}
int main()
{test();return 0;
}

2.命名空间只能在全局范围内定义

错误写法

 

这里会报错,不允许在这里命名,必须在全局范围内,在函数内部也是错误写法。

 3.命名空间可以嵌套

namespace A
{int a = 20;namespace B{int a = 10;}
}
void test()
{cout << "A::a :" << A::a << endl;//20cout << "B::a :" << A::B::a << endl;//10
}
int main()
{test();return 0;
}

可以嵌套命名空间,但在访问名字时注意作用域。

4.命名空间是开放的,可以随时定义新成员到空间中。

namespace A
{int a = 20;}
namespace A
{int b = 10;
}
void test()
{cout << "A::a :" << A::a << endl;//20cout << "A::a :" << A::b << endl;//10
}
int main()
{test();return 0;
}

在定义新成员时,编译器会自动将之前的成员与现在定义的合并在一起。

5.声明和实现可分离

比如声明一个函数,我么既可以在内部直接实现,也可以在外部通过作用域符号实现。
namespace A
{int b = 10;void test2();
/* void test2(){cout << "A::b :" << A::b << endl;}
*/
}
void A::test2()
{cout << "A::b :" << A::b << endl;
}
int main()
{A::test2();//10return 0;
}

这里注意必须要使用作用域符号,否则该函数是被认为未在该空间的。

6.无名的命名空间

定义无名的命名空间这里编译器默认为只在该源文件内部可以使用,相当于c中static修饰只能在内部链接,失去了外部连接属性。

但再在定义变量时注意不能与无命名空间里的重命名,否则无法判断,认为是重定义了。

7.命名空间别名

namespace verylongname
{int a = 10;void fun(){cout << "haha" << endl;}
}
namespace A = verylongname;int main()
{A::fun();cout << "A::a :" << A::a << endl;return 0;}

3.using声明 命名中的空间成员 可用

using编译指令使整个命名空间标识符可用.
并且命名空间标识符如果和局部变量的标识符同名,不会有冲突,优先使用局部变量。
但同时存在弊端。
我们先看直接声明命名空间A后,直接使用A中的成员。
#include <iostream>using namespace std;namespace A{int a = 10;void out(){cout << "haha" << endl;}}int main(){using namespace A;cout << "A::a为" <<a<< endl;//10out();//hahareturn 0;}

我么也可以声明各个成员再使用:

namespace A{int a = 10;void out(){cout << "haha" << endl;}}int main(){using  A::a;using  A::out;cout << "A::a为" <<a<< endl;//10out();//hahareturn 0;}
注意: 当using声明的标识符和其他同名标识符有作用域的冲突时,会产生二义性
比如:
#include <iostream>using namespace std;namespace nameA{int a = 10;void foo(){cout << "hello using" << endl;}}void test01(){//注意: 当using声明的标识符和其他同名标识符有作用域的冲突时,会产生二义性int a = 100;using nameA::a;using nameA::foo;cout << a << endl;cout << a << endl;cout << a << endl;foo();}int main(){test01();return 0;}

编译器不知道该变量a到底是属于哪一个a,编译器会报错using声明导致多次声明该变量。

因此最安全的方法是通过作用符号来访问命名空间成员。

using声明成员碰到函数重载

namespace A
{void func(){}void func(int x){}int func(int x, int y){}
}
void test()
{using A::func;//因为它们重名,这里访问了空间里的所有函数//编译器根据参数或类型,返回来行等看是哪一个函数
}

这里不会产生二义性,但函数一定是有区别的。

这里需要总要说明两点:

4.C++中形参必须有类型,返回值和实参个数做检测

c语言中的函数的形参类型可以不写,没有返回值可以返回,实参的个数不
做检测,
void foo(x,y){
return 100;}void test01(){foo(1);foo(1, 2);foo(1,2,3);}

但在c++不行,c++语言中的函数的形参类型必须写,没有返回值不可以返回,实参的个
数做检测
void foo(x, y) // 编译器报错 形参没有类型{return 100; //编译器报错 没有返回值但是返回了}void test01()
{foo(1);//实参的个数和形参的个数不一致foo(1, 2);foo(1, 2, 3);//实参的个数和形参的个数不一致}

我们在c++中函数名可以重复,编译器会根据函数的返回类型,参数的类型,参数的个数来确定你是其中那一个函数,因此必须要写。

5.更严格的类型转换

c++中对类型转换有严格的要求,需要的类型和给的类型不一致时,可能会编译保存
例如.c语言中这段代码可以编译通过:
void test02(){char * p = malloc(100);}
但是在c++中这段代码编译不通过,需要做类型转换
void test02(){char * p = (char*)malloc(100);
}

6.结构体增强

c中定义结构体变量时需要struct定义,在c++中不需要。
如简单定义一个学生A
struct student
{int age;string name;char sex;};
int main()
{student A={10,"zhansan",'nan'};cout << "A学生的年龄为:" << A.age << endl;//10return 0;}

其次还有不同

在结构体中定义函数

struct student
{int age;string name;char sex;void setname(string newname){name = newname;}void steage(int newage){age = newage;}};
int main()
{student A={10,"zhansan",'nan'};cout << "A学生的年龄为:" << A.age << endl;//10A.setname("lisi");cout << "A学生的姓名为:" << A.name << endl;return 0;}

这里我们可以学习到关于string函数的一个认识,

string str:生成空字符串string s(str):生成字符串为str的复制品string s(str, strbegin,strlen):将字符串str中从下标strbegin开始、长度为strlen的部分作为字符串初值string s(cstr, char_len):以C_string类型cstr的前char_len个字符串作为字符串s的初值string s(num ,c):生成num个c字符的字符串string s(str, stridx):将字符串str中从下标stridx开始到字符串结束的位置作为字符串初值eg:string str1;               //生成空字符串string str2("123456789");  //生成"1234456789"的复制品string str3("12345", 0, 3);//结果为"123"string str4("012345", 5);  //结果为"01234"string str5(5, '1');       //结果为"11111"string str6(str2, 2);      //结果为"3456789"

7:新增bool类型关键字

c++中可以直接使用bool类型
在c语言中,一下代码中的bool类型,需要包含stdbool.h头文件,但是在c++可以直接使用
void test04(){// bool类型的变量只有两个值 true false//true 和false 可以直接当成常量来用bool flag = true;
)

8.三目运算符功能增强

c++中的三目运算符表达式返回的可以是一个变量,但是c语言中返回的是一个常量
c语言中:
//三目运算符void test05(){int a = 10;int b = 20;printf("%d\n", a < b ? a : b);//在c语言中三目运算符返回的是表达式的值,是一个常量//(a < b ? a : b) = 100; 编译报错*(a < b ?&a :&b) = 100;}
c++中:
//三目运算符void test05(){int a = 10;int b = 20;printf("%d\n", a < b ? a : b);//在c++语言中三目运算符返回的是变量(a < b ? a : b) = 100;//编译可通过}

c++中返回变量,可以被修改,c语言返回常量无法被修改。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_96288.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2.30、守护进程(1)

2.30、守护进程&#xff08;1&#xff09;1.终端是什么2.进程组是什么3.会话是什么4.进程组、会话、控制终端之间的关系5.进程组、会话操作有哪些函数①pid_t getpgrp(void);②pid_t getpgid(pid_t pid);③int setpgid(pid_t pid, pid_t pgid);④pid_t getsid(pid_t pid);⑥pid…

Java 在循环的try catch中使用continue、break

循环的try catch中使用continue、break。 结论&#xff1a;1. 循环内catch代码端中的的continue、break可以正常生效。 2. 无论是continue还是break&#xff0c;退出循环前都会执行finally中的代码 文章目录代码&#xff1a;情形1&#xff08;无continue、break&#xff09;结果…

HTTP协议状态码大全 | 汇总HTTP所有状态码

&#x1f50a; HTTP 状态码 当浏览者访问一个网页时&#xff0c;浏览者的浏览器会向网页所在服务器发出请求。当浏览器接收并显示网页前&#xff0c;此网页所在的服务器会返回一个包含 HTTP 状态码的信息头&#xff08;server header&#xff09;用以响应浏览器的请求。 HTTP…

有反爬机制就爬不了吗?那是你还不知道反反爬,道高一尺魔高一丈啊

文章目录一、从用户请求的Headers反爬虫二、基于用户行为反爬虫&#xff08;1&#xff09;方法1&#xff08;2&#xff09;方法2三、动态页面的反爬虫四.总结不知道你们在用爬虫爬数据的时候是否有发现&#xff0c;越来越多的网站都有自己的反爬机制&#xff0c;抓取数据已经不…

300元左右的蓝牙耳机哪个好?300左右音质最好的蓝牙耳机

无线耳机是人们日常生活中必不可少的设备&#xff0c;无论是听音乐化石看电影都能获得身临其境的感觉&#xff0c;由于科技真在发展中&#xff0c;不断地的发生变化&#xff0c;百元价位就可以感受到不错的音色&#xff0c;下面小编整理了几款300左右音质表现不错的蓝牙耳机。 …

Git这么香,为啥还要可视化?

一、降低入门门槛 Github Desktop / Sourcetree / TortoiseGit “工欲善其事&#xff0c;必先利其器”&#xff0c;团队项目开发中的高效协作管理非常重要。 对于高级程序员及IT老兵来说&#xff0c;有了Git直接用命令行管理也许就足够了&#xff0c; 但可视化的工具会降低技术…

【pta刷题】小技巧

好久没更了 写天梯模拟L1都有题不能AC&#xff0c;是什么品种的蒟蒻 L1-7 谷歌的招聘 题目详情 - L1-7 谷歌的招聘 (pintia.cn) 自己写半天都是Segmentation Fault&#xff0c; 学习一下几个函数叭// 1.substr&#xff08;&#xff09;函数 获取子串 #include<bits/st…

Distilling Knowledge via Knowledge Review(引言翻译)

翻译得可能不太准确&#xff0c;希望有能力的各位批评指正&#xff01; Introduction 第一段 深度卷积神经网络&#xff08;CNN&#xff09;在计算机视觉多数任务中取得了显著的成功。 然而&#xff0c;卷积网络的成功往往伴随着相当大的计算和内存消耗&#xff0c; 使得将…

企业级信息系统开发讲课笔记2.3 利用MyBatis实现关联查询

文章目录零、本节学习目标一、查询需求&#xff08;一&#xff09;针对三张表关联查询&#xff08;二&#xff09;按班级编号查询班级信息&#xff08;三&#xff09;查询全部班级信息二、创建数据库表&#xff08;一&#xff09;创建教师表&#xff08;二&#xff09;创建班级…

我的世界服务器配置推荐,搭建我的世界服务器教程

以下是我整理的部分服务器配置建议与教程&#xff0c;供你参考。 服务器配置推荐&#xff1a; 1. CPU&#xff1a;至少是四核心2.5GHz以上的处理器&#xff0c;建议使用Intel Xeon E3系列或AMD Ryzen 5以上系列 2. 内存&#xff1a;建议至少8GB&#xff0c;如果服务器人数较多…

【Linux】工具(5)——gdb

今天我们来到Linux工具的最后一篇博客&#xff1a;gdb的使用 目录 一、Linux下的release和debug 二、gdb常用指令选项 一、Linux下的release和debug 我们先来写一个Makfile&#xff0c;来方便我们编译代码&#xff1a; 再来写一个test.c的源文件&#xff1a; 接着我们使用m…

unity的下载和安装

我做了一个不知道算不算好的决定&#xff0c;其实还是很难过的。但过去的事就让他过去吧&#xff0c;现在开始学习一些其他的东西吧&#xff0c;比如说unity吧。 一、下载安装工具 Unity的国内下载网址&#xff1a;https://unity.cn/ 进入官网后&#xff0c;选择想要的版本 …

CI570 3BSE001440R1适用于数字功能需求较多的设计

CI570 3BSE001440R1适用于数字功能需求较多的设计 尽管纯硅的CMOS 制程被认为仅适用于数字功能需求较多的设计&#xff0c;而不适用于以模拟电路为主的射频IC 设计&#xff0c;不过历经十几年的努力后&#xff0c;随着CMOS 性能的提升、晶圆代工厂在0.25mm 以下制程技术的配合、…

哪个品牌的蓝牙耳机便宜耐用?内行公认四大便宜耐用的蓝牙耳机

蓝牙耳机发展至今&#xff0c;品牌众多&#xff0c;且各品牌旗下拥有无数不同价格的耳机&#xff0c;各自的主打优势又不一样。那么&#xff0c;哪个品牌的蓝牙耳机便宜耐用&#xff1f;下面&#xff0c;我来给大家推荐四款便宜耐用的蓝牙耳机&#xff0c;一起来看看吧。 一、…

Verilog Tutorial(7)If语句和Case语句

写在前面在自己准备写verilog教程之前&#xff0c;参考了许多资料----FPGA Tutorial网站的这套verilog教程即是其一。这套教程写得不错&#xff0c;只是没有中文&#xff0c;在下只好斗胆翻译过来&#xff08;加了自己的理解&#xff09;分享给大家。这是网站原文&#xff1a;h…

webassembly——同源策略问题的处理(浏览器不能加载本地资源的问题)

原因&#xff1a;在用chatGPT生成可视化地图前端文件后&#xff0c;打开不能正常显示 WebAssembly是一种新的二进制代码格式&#xff0c;它可以提供更高的性能和更好的安全性。WebAssembly遵循同源策略&#xff0c;这意味着只有与运行WebAssembly代码相同域名下的JavaScript代码…

FPGA采集AD7606数据UDP网络传输 提供工程源码和技术支持 附带上位机接收软件

目录1、前言2、我这里已有的UDP方案3、AD7606采集详解4、UDP设计方案5、AD7606 UDP传输详细设计方案UDP应用的设计思路获取FPGA网卡信息获取数据UDP发送数据组包UDP发送流程6、vivado工程详解7、上板调试验证并演示8、福利&#xff1a;工程代码的获取1、前言 目前网上的fpga实…

将excel导入到sqlite的方法代码

Python实现excel转sqlite的方法&#xff0c;具体如下&#xff1a; Python环境的安装配置就不说了&#xff0c;个人喜欢pydev的开发环境。 python解析excel需要使用第三方的库&#xff0c;这里选择使用xlrd 下面是源代码&#xff1a; #!/usr/bin/python # encodingutf-8 Creat…

[C语言]结构体大小计算——你的心到底够不够装下我

结构心中时满时不满&#xff0c;心中装人心更大&#xff0c;究竟海王或专一&#xff0c;详解干货把理讲。 除了C语言的基础数据类型以外&#xff0c;还允许用户创建自定义类型&#xff0c;而对于最常用的自定义类型&#xff1a;结构体 的大小计算自然就非常重要了。 结构体 …

迁移学习常用数据集

目录 Office-31 PACS Office-Caltech10 MNISTUSPS 迁移学习常用数据集 Office-31 Office-31 Dataset 即 Office Dataset 是视觉迁移学习中的主流基准数据集&#xff0c;该数据集包含了31类办公室环境中常见的目标物体&#xff0c;如笔记本电脑、文件柜、键盘等&#xff0…