C++高级编程01

news2024/11/14 23:26:38

目录

1、双冒号作用域运算符

2、namespace命名空间

3、using声明以及using编译指令

using 声明

4、C++对C语言的增强

4、const链接属性

5、const分配内存情况

6、尽量用const代替define

7、引用


1、双冒号作用域运算符

    ::代表作用域  如果前面什么都不添加 代表全局作用域

 

int atk = 1000;

void test01()
{
	int atk = 100;
	cout << "atk =" << atk << endl;


	//::代表作用域,如果前面什么都不加代表全局作用域
	cout << "全局atk = " << ::atk << endl;
}

结果

atk =100
全局atk = 1000

2、namespace命名空间

  1. 命名空间用途:解决名称冲突
  2. 命名空间下可以存放 : 变量、函数、结构体、类…
  3. 命名空间必须要声明在全局作用域
  4. 命名空间可以嵌套命名空
  5. 命名空间是开放的,可以随时将新成员添加到命名空间下
  6. 命名空间可以匿名的
  7. 命名空间可以起别名

先写一个

为game1 的头文件

#include"game1.h"

void KingGlory::goAtk()
{
	cout << "王者荣耀攻击我" << endl;
}

game2.h的头文件

#include <iostream>
using namespace std;

namespace LOL
{
	void goAtk();
}

game1.c的文件

#include"game1.h"

void KingGlory::goAtk()
{
	cout << "王者荣耀攻击我" << endl;
}

game2.c的文件

#include"game2.h"

void LOL::goAtk()
{
	cout << "LOL攻击我" << endl;
}
#define _CRT_SECURE_NO_WARNINGS 
#include <iostream>
using namespace std;
#include "game1.h"
#include "game2.h"

// 1.命名空间用途:解决名称冲突

void test01()
{
	KingGlory::goAtk();
	LOL::goAtk();
}

//2.命名空间下可以放 变量 函数 结构体 类
namespace A
{
	int m_A;
	void func();
	struct Person
	{};

	class Animal
	{};
}

//3.命名空间 必须声明在全局作用域下
void test02()
{
	// namespace B{}    不可以命名到局部作用域
}

//4.命名空间可以嵌套命名空间
namespace B 
{
	int m_A = 10;
	namespace C
	{
		int m_A = 20;
	}

}

//5.命名空间是开放的,可以随时给命名空间添加新成员,重名的命名空间是进行合并操作,而不是覆盖操作

namespace B
{
	int m_B = 100;
}

void test04()
{
	cout << "B空间下的m_A = " << B::m_A << endl;
	cout << "B空间下的m_B = " << B::m_B << endl;
}
void test03()
{
	cout << "B空间下的m_A = " << B::m_A << endl;
	cout << "C空间下的m_A = " << B::C::m_A << endl;
}

//6.命名空间是可以匿名的
namespace
{
	int m_C = 1000;
	int m_D = 2000;
}

void test05()
{
	cout << "m_C" << m_C << endl;
	cout << "m_D" << m_D << endl;
}

//7.命名空间可以起别名

namespace longName
{
	int m_E = 10;
}

void test06()
{
	namespace LN = longName;
	cout << "longName:" << longName::m_E << endl;
	cout << "LN:" << LN::m_E << endl;
}

3、using声明以及using编译指令

using 声明

#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;

namespace KingGlory
{
	int sunwukongId = 1;
}

void test01()
{
 	cout << KingGlory::sunwukongId << endl;

	using KingGlory::sunwukongId;
	cout << sunwukongId << endl;
}

void test02()
{
	int sunwukongId = 2;
	//2.当using编译指令和就近原则同时出现的时候会优先使用就近原则
	using namespace KingGlory;
	cout << sunwukongId << endl;  
}

在test02中先使用就近原则,所以输出为当using声明与 就近原则同时出现,出错,尽量避免

using编译指令

  1. using namespace KingGlory;
  2. 当using编译指令  与  就近原则同时出现,优先使用就近
  3. 当using编译指令有多个,需要加作用域 区分

4、C++对C语言的增强

    1. 全局变量检测增强
      1. int a ;
      2. int a = 10;  C下可以,C++重定义
    2. 函数检测增强
      1. 函数的返回值
      2. 形参类型
      3. 函数调用参数个数
    3. 类型转换检测增强
      1. char * p = (char *)malloc(64)  C++下必须等号左右一致类型
    4. struct 增强
      1. C++可以在结构体中放函数
      2. 创建结构体变量   可以简化关键字struct
    5. bool数据类型扩展
      1. C++才有bool类型
      2. 代表真 --- 1 true  假 ---- 0 false
      3. sizeof  = 1
    6. 三目运算符增强
      1. C语言下返回的是值
      2. C++语言下返回的是变量
    7. const增强
      1. C语言下
        1. 全局const   直接修改 失败  间接修改  语法通过,运行失败
        2. 局部 const  直接修改  失败  间接修改  成功
      2. C++语言下
        1. 全局 const  和C结论一样
        2. 局部 const  直接修改失败   间接修改 失败  
        3. C++const可以称为常量 

4、const链接属性

  1. C语言下const修饰的全局变量默认是外部链接属性
  2. C++下const修饰的全局变量默认是内部链接属性,可以加extern 提高作用域
#define _CRT_SECURE_NO_WARNINGS 1
#include <bits/stdc++.h>
using namespace std;

//1、对const取地址,会分配零时内存
void test01()
{
	const int a = 10;
	int* p = (int*)&a;
}

//2、使用普通变量初始化const,可以修改 
void test02()
{
	int a = 10;
	const int b = 10;

	int* p =(int *) & b;
	*p = 1000;

	cout << "b = " << b << endl;
}

// 3、对于自定义数据类型

struct Person
{
	string m_name;
	int m_Age;
};

void test03()
{
	const Person p;
	Person * pp = (Person*)&p;
	pp->m_name = "Tom";
	pp->m_Age = 10;
}

5、const分配内存情况

    1. 对const变量 取地址 ,会分配临时内存  
    2. 使用普通变量  初始化 const变量

对于自定义数据类型

#define _CRT_SECURE_NO_WARNINGS 1
#include <bits/stdc++.h>
using namespace std;

//1、对const取地址,会分配零时内存
void test01()
{
	const int a = 10;
	int* p = (int*)&a;
}

//2、使用普通变量初始化const,可以修改 
void test02()
{
	int a = 10;
	const int b = 10;

	int* p =(int *) & b;
	*p = 1000;

	cout << "b = " << b << endl;
}

// 3、对于自定义数据类型

struct Person
{
	string m_name;
	int m_Age;
};

void test03()
{
	const Person p;

	Person * pp = (Person*)&p;
	pp->m_name = "Tom";
	pp->m_Age = 10;
}


 

6、尽量用const代替define

 define出的宏常量,没有数据类型、不重视作用域

7、引用

  1.  目的:起别名
    1. 语法: 类型(与原名类型必须一致)   &别名  =  原名
    2. 引用必须要初始化
    3. 引用一旦初始化后,就不可以引向其他变量
    4. 建立对数组引用
      1. 直接建立引用
      2. int arr[10];
      3. int(&pArr)[10] = arr;
    5. 先定义出数组类型,再通过类型 定义引用
      1. typedef int(ARRAY_TYPE)[10];
      2. ARRAY_TYPE & pArr2 = arr;
#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;

//1.引用的基本作用是起别名 

void test01()
{
	int a = 10;
	int& b = a;
	b = 100;
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
}
void test02()
{
	int a = 10;
	// int &b;  引用必须初始化
	int& b = a;
	// 引用一旦初始化,就不可以引向其他变量

	int c = 100;
	b = c;
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
	cout << "c = " << c << endl;
}

void test03()
{
	//1、直接建立引用
	int arr[10]={0};
	int(&pArr)[10] = arr;

	for (int i = 0; i < 10; i++)
	{
		arr[i] = 100 + i;
	}
	for (int i = 0; i < 10; i++)
	{
		cout << pArr[i] << endl;
	}
}

test01的结果

 

 

test02的结果

 

 test03的结果

 

常量的引用

#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;

void test01()
{
	//int &ref = 10;
	const int& ref = 10;  //加了const之后,相当于写成int temp = 10;const int &ref = temp
	int* p = (int*)&ref;
	*p = 1000;
	cout << ref << endl;
	
}
void  showValue(const int& a)
{
	cout << "a = " << a << endl;
}

//常量引用的使用场景:修饰函数的形参防止无操作
void test02()
{
	int a = 100;
	showValue(a);
	cout << "a = " << a << endl;
}

 

 

指针的引用

#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;
struct Person
{
	int age;
};
void allocateSpace(Person** p)
{
	//p指向 指针的指针 *p 指针指向的是person本体 **p person本体
	*p = (Person*)malloc(sizeof(Person));
	(*p)->age = 10;
}
void test01()
{
	Person* p = NULL;
	allocateSpace(&p);
	cout << "p.age = " << p->age << endl;
}
void allocateSpace2(Person*& pp) //Person * pp = p 
{
	pp = (Person*)malloc(sizeof(Person);
	pp->age = 20;
}
void test02()
{
	Person* p = NULL;
	allocateSpace(p);
	cout << "p.age = " << p->age << endl;
}

test01的结果

 test02的结果

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

K8S资源控制器管理

资源控制器 1 资源控制器1.1 控制基础1.1.1 控制原理1.1.2 控制对象 1.2 标签选择器1.2.1 标签基础1.2.2 标签选择器 1.3 副本控制器1.3.1 RC&RS1.3.2 Deploy基础1.3.3 Deploy进阶1.3.4 DaemonSet1.3.5 任务控制器 1.4 监视控制器1.4.1 metrics服务1.4.2 HPA实践 1 资源控制…

Git 推送教程

一般 add commit push即可。Git全流程&#xff1a; git init #初始化仓库 git add .文件名 #添加文件&#xff0c;添加全部文件可以直接写. git commit -m "信息" #提交到本地仓库 git remote add origin 远程仓库地址 #链接远程仓库&#xff0c;创建主分支 git p…

【每日一题】2. 两数相加

【每日一题】2. 两数相加 2. 两数相加题目描述解题思路 2. 两数相加 题目描述 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一…

MySQL的体系架构

文章目录 前言MySQL的Server层MySQL的存储引擎1&#xff09;InnoDB 存储引擎2&#xff09;MyISAM 存储引擎3&#xff09;Memory 存储引擎 前言 在学习一种事务之前&#xff0c;我们需要先了解事物的基本组成结构&#xff0c;清楚了事物的基本组成结构之后&#xff0c;我们才能…

QCC51XX---chain是什么?

QCC51XX---系统学习目录_嵌入式学习_force的博客-CSDN博客 高通的DSP对很多人来说还是比较难以理解与操作的,DSP里最基本的是要认识音频的处理链路,也就是平台中的chain。他是由多个模块(operator)连接起来的,连接的方法sink和earbud有些不同,这里会从6.x开始sink的chain…

shell判断程序是否运行

一、需求 服务部署在linux上&#xff0c;要求服务器上的服务可以一直保持正常运行 二、问题 在linux上部署的微服务&#xff0c;不知道什么原因过一段时间就自己停掉了&#xff0c;无法启动。 三、解决办法 添加angle守护进程&#xff0c;通过定时执行脚本来判断程序是否运行…

AI 绘画 - 建筑绘图辅助设计之模型训练

前情提要 2023-06-18 周日 杭州 小雨 小记: 昨天搞的好累&#xff0c;10点左右就想着先躺一会儿&#xff0c;然后就睡过去了&#xff0c;很奇怪&#xff0c;如果进行 AI 绘画&#xff0c;晚上就会做很奇怪的梦&#xff0c;说不上来的那种感觉&#xff0c;就是莫名的不舒服。 …

微信怎么能自动回复?

有些小伙伴可能有多个微信号来进行业务活动&#xff0c;一天收到的信息太多&#xff0c;眼花缭乱&#xff0c;回复不过来&#xff0c;就想在微信可不可以有个自动回复消息&#xff0c;就可以通过自动回复引导用户看到想让他们看到的。这样就可以降低工作量的同时&#xff0c;提…

Hive Metastore 表结构

Hive MetaStore 的ER 图如下。 部分表结构和说明。 CTLGS(CATALOGS) catalogs 可以隔离元数据。默认只有1行。一个 CATALOG 可以有多个数据库。 mysql> DESC CTLGS; -------------------------------------------------------- | Field | Type | Null |…

判断关系属于哪一种范式(期末考试必看)

1NF&#xff08;第一范式&#xff09; 属性值是不可分的原子值 2NF&#xff08;第二范式&#xff09; R1NF&#xff0c;每个非主属性都完全函数依赖于R的候选键 3NF&#xff08;第三范式&#xff09; R1NF&#xff0c;每个非主属性都不传递依赖于 R的候选键 BCNF&#xff08;BC…

ubuntu修改主机名和用户名

参考文章&#xff1a; https://blog.csdn.net/fkmmmm/article/details/127333212 一、修改主机名 sudo vi /etc/hostname2、 sudo vi /etc/hosts3、 sudo reboot二、修改用户名 1、修改所有原用户名&#xff08;如果文件内没有原用户名则不用改 sudo vi /etc/sudoers 2、 s…

【C++11】 包装器 | bind

文章目录 1. 包装器概念理解用法成员函数的包装静态成员函数非静态成员函数 2. bind概念理解功能1 调整参数顺序 (用处不大)功能2 调整参数个数 1. 包装器 概念理解 function包装器 也被叫做 适配器 C11中function本质是类模板&#xff0c;也是一个包装器 意义在于 对可调用…

LeetCode-69. x 的平方根

LeetCode-69. x 的平方根 1、题目描述2、解题思路3、代码实现4、解题记录 ) 1、题目描述 题目描述&#xff1a; 给你一个非负整数 x &#xff0c;计算并返回 x 的 算术平方根 。 由于返回类型是整数&#xff0c;结果只保留 整数部分 &#xff0c;小数部分将被 舍去 。 示例1&a…

【裸机开发】I2C 通信接口(二)—— I2C 寄存器解析

目录 一、硬件原理图分析 二、IO 复用寄存器解析 三、I2C 寄存器解析 3.1 时钟配置 3.2 I2C1_IADR&#xff08;设置从机地址&#xff09; 3.3 I2C1_IFDR&#xff08;设置分频值&#xff09; 3.4 I2C1_I2CR&#xff08;I2C使能、中断控制&#xff09; 3.5 I2C1_I2SR…

不知道校园跑腿项目如何运营?那就先看看这份运营指导方案!

当大学生在校创业&#xff0c;其实并不与课业学习矛盾。相反&#xff0c;大学生可以抓住校园市场&#xff0c;利用校园这一具有自然地理优势的封闭市场&#xff0c;深入培育师生客户的需求&#xff0c;进入校园市场的蓝海&#xff0c;在不耽误学习的情况下有一个良好的收入来源…

AIGC-midjourney系列1-制作自己的证件照,卡通照

1 账号 淘宝购买共享账户 2 新建服务器 3 添加midjourney机器人 4 添加insightface机器人 在服务器聊天框输入并发送 https://discord.com/oauth2/authorize?client_id1090660574196674713&permissions274877945856&scopebot点击链接 5 insightface使用 使用…

cf 比赛 03

2021.04.28 训练地址 B. Bananas in a Microwave 题意&#xff1a;一开始的时候手里的数是0 这个题一开始想复杂了. 其实很简单. 我们想一个性质&#xff0c;我们用背包dp做这个题&#xff0c;从大到小枚举体积 j. 然后状态转移是从前往后推&#xff08;不是之前的那个找前驱…

记录 windows11 qemu安装 麒麟操作系统的经历

因为本人供职的公司&#xff0c;要求国产化环境很多的软件&#xff0c;同时为了方便docker部署&#xff0c; 所以开启了 qemu虚拟aarch64环境的经历&#xff0c;用的软件如下&#xff1a; 有需要的私信&#xff0c;存在了&#xff0c;阿里云盘&#xff0c;百度云盘没有会员就是…

大厂面试测试岗,你一个很小的错误就能让你被淘汰

背景介绍 前后参加过几家互联网公司的测试开发岗位面试&#xff0c;其中两次百度的面试&#xff0c;一次止步三面&#xff0c;另一次止步于四面。这里就主要总结一下百度的面试经历和心得体会。总体感觉百度的面试官比较注重基础&#xff0c;问题不难但是覆盖范围比较全面。相…

栈,栈帧Stack Frames和函数调用过程Control Flow

栈其实就是计算机系统内存中的一小块。栈是一块特殊的内存区域&#xff0c;栈在内存中的增长方向是向低地址扩展&#xff0c;%rsp寄存器存储栈的最低地址&#xff0c;即栈顶元素的地址。这种栈结构在程序中的应用有助于实现函数调用、局部变量的管理以及递归等功能。 Push和Pop…