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 的核心好处: 一、一站式环境管理:…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...
