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…...
IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...
Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...
图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...
GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...
NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...
基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...
