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.作用域运算符::
#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声明 命名中的空间成员 可用
#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;}
#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++中形参必须有类型,返回值和实参个数做检测
void foo(x,y){
return 100;}void test01(){foo(1);foo(1, 2);foo(1,2,3);}
void foo(x, y) // 编译器报错 形参没有类型{return 100; //编译器报错 没有返回值但是返回了}void test01()
{foo(1);//实参的个数和形参的个数不一致foo(1, 2);foo(1, 2, 3);//实参的个数和形参的个数不一致}
我们在c++中函数名可以重复,编译器会根据函数的返回类型,参数的类型,参数的个数来确定你是其中那一个函数,因此必须要写。
5.更严格的类型转换
void test02(){char * p = malloc(100);}
void test02(){char * p = (char*)malloc(100);
}
6.结构体增强
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类型关键字
void test04(){// bool类型的变量只有两个值 true false//true 和false 可以直接当成常量来用bool flag = true;
)
8.三目运算符功能增强
//三目运算符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;}
//三目运算符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的扩展: 1.作用域运算符:: 2.命名空间 1.c命名空间(namespace) 2.命名空间的使用 1.在不同命名空间内可以创建相同的名称 2.命名空间只能在全…...

Redis锁的租约问题
目录Redis的租约问题Redis租约问题的想法Redis租约问题的解决方案Redis的租约问题 首先我们先来说一说什么是Redis的租约问题。 在我们实现Redis分布式锁的时候,我们会出现Redis锁的时间<业务执行执行时间,这其实就是一个典型的租约问题…...
2023年全国最新高校辅导员精选真题及答案50
百分百题库提供高校辅导员考试试题、辅导员考试预测题、高校辅导员考试真题、辅导员证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 94.一般认为,在具有了道德认知和道德情感的情况下,道德行为的产生…...
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请求和响应的细节,使开发人员可以更专注于业务逻辑的实现。在本篇文章中,我们将使用Go语言实现一个简单的Web框架,类似于Gin框架。 功能 我们的Web框架需要实现以下功能…...

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

KlayGE-004-InputCaps 例子分析
InputCaps处理外部输入的事件 该例子主要由两部分内容: 外部输入事件获取 可以处理keyboard、mouse、joystick、touch、sensor的输入事件 显示一个ui图标按钮 Input 定义监听事件类型: KlayGE::InputActionDefine actions[] {InputActionDefin…...
组装机经验、软硬件故障排除、网络问题
目录 主板 CPU 内存 显卡 判断显卡好坏的步骤 新买的显卡安装后显示器不亮 电源 其他 网络问题 主板 1.不同主板对于不同数量的内存条安装的位置有要求,要按照主板规定的位置安装不同数量的内存条,特别是服务器主板,否则系统可能起…...

【行为型模式】责任链模式
文章目录1、简介2、结构3、实现方式3.1、案例引入3.2、结构分析3.3、具体实现4、责任链优缺点5、应用场景1、简介 责任链模式(Chain of Responsibility)是一种行为型设计模式,它允许对象在链上依次处理请求,用户只需要将请求发送到责任链上即可…...
C++命令模式 指挥家:掌控命令模式之美
C指挥家:掌控命令模式之美 (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 秘籍中文第二版:六、特殊数组和通用函数
原文:NumPy Cookbook - Second Edition 协议:CC BY-NC-SA 4.0 译者:飞龙 在本章中,我们将介绍以下秘籍: 创建通用函数查找勾股三元组用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)实验案例
密度聚类算法(DBSCAN)实验案例 描述 DBSCAN是一种强大的基于密度的聚类算法,从直观效果上看,DBSCAN算法可以找到样本点的全部密集区域,并把这些密集区域当做一个一个的聚类簇。DBSCAN的一个巨大优势是可以对任意形状…...

第07章_面向对象编程(进阶)
第07章_面向对象编程(进阶) 讲师:尚硅谷-宋红康(江湖人称:康师傅) 官网:http://www.atguigu.com 本章专题与脉络 1. 关键字:this 1.1 this是什么? 在Java中,this关键字不算难理解…...
异常的讲解(2)
目录 throws异常处理 基本介绍 throws异常处理注意事项和使用细节 自定义异常 基本概念 自定义异常的步骤 throw 和throws的区别 本章作业 第一题 第二题 第三题 第四题 throws异常处理 基本介绍 1)如果一个方法(中的语句执行时)可能生成某种异常,但是…...

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日消息,据中国移动通信联合会元宇宙产业工作委员会网站,中国移动通信联合会元宇宙产业工作委员会、中国通信工业协会区块链专业委员会等,共同发布“关于元宇宙生成式人工智能(类 ChatGPT)应用的行业提示”。提示内…...
轻松掌握Qt FTP 机制:实现高效文件传输
轻松掌握Qt FTP:实现高效文件传输一、简介(Introduction)1.1 文件传输协议(FTP)Qt及其网络模块(Qt and its Network Module)QNetwork:二、QNetworkAccessManager上传实例(Qt FTP Upl…...

用AI帮我写一篇关于FPGA的文章,并推荐最热门的FPGA开源项目
FPGA定义 FPGA(Field Programmable Gate Array)是一种可编程逻辑器件,可以在硬件电路中实现各种不同的逻辑功能。与ASIC(Application Specific Integrated Circuit,特定应用集成电路)相比,FPGA…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...

大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...

MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...

React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...