当前位置: 首页 > news >正文

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

目录

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语言返回常量无法被修改。

相关文章:

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

目录 1.面向过程与面向对象的编程 2.面向对象编程的三大特点 3.c对c的扩展&#xff1a; 1.作用域运算符&#xff1a;&#xff1a; 2.命名空间 1.c命名空间&#xff08;namespace&#xff09; 2.命名空间的使用 1.在不同命名空间内可以创建相同的名称 2.命名空间只能在全…...

Redis锁的租约问题

目录Redis的租约问题Redis租约问题的想法Redis租约问题的解决方案Redis的租约问题 首先我们先来说一说什么是Redis的租约问题。   在我们实现Redis分布式锁的时候&#xff0c;我们会出现Redis锁的时间<业务执行执行时间&#xff0c;这其实就是一个典型的租约问题&#xf…...

2023年全国最新高校辅导员精选真题及答案50

百分百题库提供高校辅导员考试试题、辅导员考试预测题、高校辅导员考试真题、辅导员证考试题库等&#xff0c;提供在线做题刷题&#xff0c;在线模拟考试&#xff0c;助你考试轻松过关。 94.一般认为&#xff0c;在具有了道德认知和道德情感的情况下&#xff0c;道德行为的产生…...

mall商城之k8s部署-4

文章目录 一、k8s部署应用服务1)master拷贝yaml2)批量修改镜像地址3)批量修改nacos地址3)创建命名空间4)创建取sercet5)配置yaml6)对象存储oss7)查看nacos1、导入配置文件2、修改配置文件8)部署到ms命名空间一、k8s部署应用服务 1)master拷贝yaml #将源码文件 mkdi…...

使用Go语言打造轻量级Web框架

前言 Web框架是Web开发中不可或缺的组件。它们的主要目标是抽象出HTTP请求和响应的细节&#xff0c;使开发人员可以更专注于业务逻辑的实现。在本篇文章中&#xff0c;我们将使用Go语言实现一个简单的Web框架&#xff0c;类似于Gin框架。 功能 我们的Web框架需要实现以下功能…...

【开源项目】BallCat 项目脚手架

简介 &#x1f389;&#x1f389;&#x1f389; 基于 React 和 Ant Design 版本的前端 ballcat-ui-react 已发布&#xff0c;欢迎大家尝鲜使用 BallCat 组织旨在为项目快速开发提供一系列的基础能力&#xff0c;方便使用者根据项目需求快速进行功能拓展。 在以前使用其他后台管…...

KlayGE-004-InputCaps 例子分析

InputCaps处理外部输入的事件 该例子主要由两部分内容&#xff1a; 外部输入事件获取 ​ 可以处理keyboard、mouse、joystick、touch、sensor的输入事件 显示一个ui图标按钮 Input 定义监听事件类型&#xff1a; KlayGE::InputActionDefine actions[] {InputActionDefin…...

组装机经验、软硬件故障排除、网络问题

目录 主板 CPU 内存 显卡 判断显卡好坏的步骤 新买的显卡安装后显示器不亮 电源 其他 网络问题 主板 1.不同主板对于不同数量的内存条安装的位置有要求&#xff0c;要按照主板规定的位置安装不同数量的内存条&#xff0c;特别是服务器主板&#xff0c;否则系统可能起…...

【行为型模式】责任链模式

文章目录1、简介2、结构3、实现方式3.1、案例引入3.2、结构分析3.3、具体实现4、责任链优缺点5、应用场景1、简介 责任链模式(Chain of Responsibility)是一种行为型设计模式&#xff0c;它允许对象在链上依次处理请求&#xff0c;用户只需要将请求发送到责任链上即可&#xf…...

C++命令模式 指挥家:掌控命令模式之美

C指挥家&#xff1a;掌控命令模式之美 (C Conductor: Master the Beauty of Command Pattern一、引言 (Introduction)1.1 命令模式概述 (Overview of Command Pattern)1.2 命令模式的应用场景 (Application Scenarios of Command Pattern)二、命令模式的基本概念 (Basic Concep…...

学会 制作极简搜索浏览器 —— 并将 ChatGPT 接入浏览器

前期回顾 Vue3 Ts Vite pnpm 项目中集成 —— eslint 、prettier、stylelint、husky、commitizen_0.活在风浪里的博客-CSDN博客搭建VIte Ts Vue3项目并集成eslint 、prettier、stylelint、huskyhttps://blog.csdn.net/m0_57904695/article/details/129950163?spm1001.2…...

NumPy 秘籍中文第二版:六、特殊数组和通用函数

原文&#xff1a;NumPy Cookbook - Second Edition 协议&#xff1a;CC BY-NC-SA 4.0 译者&#xff1a;飞龙 在本章中&#xff0c;我们将介绍以下秘籍&#xff1a; 创建通用函数查找勾股三元组用chararray执行字符串操作创建一个遮罩数组忽略负值和极值使用recarray函数创建一…...

各种交叉编译工具链的区别

目录 1 命名规则 2 实例 2.1 arm-none-eabi-gcc 2.2 arm-none-linux-gnueabi-gcc 2.3 arm-eabi-gcc 2.4 armcc 2.5 arm-none-uclinuxeabi-gcc 和 arm-none-symbianelf-gcc 3 gnueabi和gnueabihf的区别(硬浮点、软浮点) 4 Linaro公司出品的交叉编译工具链 5 ARM公司出…...

密度聚类算法(DBSCAN)实验案例

密度聚类算法&#xff08;DBSCAN&#xff09;实验案例 描述 DBSCAN是一种强大的基于密度的聚类算法&#xff0c;从直观效果上看&#xff0c;DBSCAN算法可以找到样本点的全部密集区域&#xff0c;并把这些密集区域当做一个一个的聚类簇。DBSCAN的一个巨大优势是可以对任意形状…...

第07章_面向对象编程(进阶)

第07章_面向对象编程(进阶) 讲师&#xff1a;尚硅谷-宋红康&#xff08;江湖人称&#xff1a;康师傅&#xff09; 官网&#xff1a;http://www.atguigu.com 本章专题与脉络 1. 关键字&#xff1a;this 1.1 this是什么&#xff1f; 在Java中&#xff0c;this关键字不算难理解…...

异常的讲解(2)

目录 throws异常处理 基本介绍 throws异常处理注意事项和使用细节 自定义异常 基本概念 自定义异常的步骤 throw 和throws的区别 本章作业 第一题 第二题 第三题 第四题 throws异常处理 基本介绍 1)如果一个方法(中的语句执行时)可能生成某种异常&#xff0c;但是…...

jvm内存结构

1. 栈 程序计数器 2. 虚拟机栈 3. 本地方法栈 4. 堆 5. 方法区 1.2栈内存溢出 栈帧过多导致栈内存溢出 /*** 演示栈内存溢出 java.lang.StackOverflowError* -Xss256k*/ public class Demo1_2 {private static int count;public static void main(String[] args) {try {meth…...

要刹车?生成式AI迎新规、行业连发ChatGPT“警报”、多国考虑严监管

4月13日消息&#xff0c;据中国移动通信联合会元宇宙产业工作委员会网站&#xff0c;中国移动通信联合会元宇宙产业工作委员会、中国通信工业协会区块链专业委员会等&#xff0c;共同发布“关于元宇宙生成式人工智能&#xff08;类 ChatGPT&#xff09;应用的行业提示”。提示内…...

轻松掌握Qt FTP 机制:实现高效文件传输

轻松掌握Qt FTP&#xff1a;实现高效文件传输一、简介&#xff08;Introduction&#xff09;1.1 文件传输协议&#xff08;FTP&#xff09;Qt及其网络模块&#xff08;Qt and its Network Module&#xff09;QNetwork:二、QNetworkAccessManager上传实例&#xff08;Qt FTP Upl…...

用AI帮我写一篇关于FPGA的文章,并推荐最热门的FPGA开源项目

FPGA定义 FPGA&#xff08;Field Programmable Gate Array&#xff09;是一种可编程逻辑器件&#xff0c;可以在硬件电路中实现各种不同的逻辑功能。与ASIC&#xff08;Application Specific Integrated Circuit&#xff0c;特定应用集成电路&#xff09;相比&#xff0c;FPGA…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

R语言AI模型部署方案:精准离线运行详解

R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中&#xff0c;具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类&#xff1a; 身份验证机制&#xff1a;直接将未经授权的爬虫阻挡在外反爬技术体系&#xff1a;通过各种技术手段增加爬虫获取数据的难度…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

Golang——6、指针和结构体

指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...

​​企业大模型服务合规指南:深度解析备案与登记制度​​

伴随AI技术的爆炸式发展&#xff0c;尤其是大模型&#xff08;LLM&#xff09;在各行各业的深度应用和整合&#xff0c;企业利用AI技术提升效率、创新服务的步伐不断加快。无论是像DeepSeek这样的前沿技术提供者&#xff0c;还是积极拥抱AI转型的传统企业&#xff0c;在面向公众…...

命令行关闭Windows防火墙

命令行关闭Windows防火墙 引言一、防火墙:被低估的"智能安检员"二、优先尝试!90%问题无需关闭防火墙方案1:程序白名单(解决软件误拦截)方案2:开放特定端口(解决网游/开发端口不通)三、命令行极速关闭方案方法一:PowerShell(推荐Win10/11)​方法二:CMD命令…...