c++ 多重包含/定义 || 链接性 || 生命周期

 作用域&&生命周期

  1. C++ 中的作用域(scope)指的是变量、函数或其他标识符的可见和可访问的范围。

  2. 生命周期(Lifetime)指的是变量或对象存在的时间段。它开始于变量或对象的创建(定义)时刻,结束于其被销毁的时刻。

  3. 作用域:通过其声明的位置来确定。

    1. 全局作用域:定义在(类 / 函数 )外部的变量 || 声明/不先声明直接定义在 (类 / 函数 )外部的函数 || 类,整个程序中都可以访问,不同文件中需要,extern type name,访问。生命周期:整个程序

    2. 文件作用域:static,将全局变量/函数 作用域限制在当前文件中,对其他文件不可见。生命周期:整个程序

    3. 命名空间作用域:在命名空间定义的,通过作用域解析运算符访问。在作用域外新增一个命名空间作用域,并不会影响对象的本身链接性 / 生命周期。其实还是当作普通的作用域看。

    4. 类作用域:在类中定义的 成员变量 || 成员函数声明  || 内联函数,可以通过创建类的对象或引用来访问,作用域:类的私有成员只能在类的内部访问,而公有成员可以在类的外部通过对象访问。生命周期:与类的实例(对象)相关(类对象的生命周期,取决于构造(),析构())

    5. 函数作用域(局部作用域):函数的参数和在函数内部定义的 变量 / 形参,作用域函数,这能在函数内部访问。生命周期:局部

    6. 代码块作用域(局部作用域){}内定义,作用域块,这能在块内部访问。生命周期:局部

变量分类 && 作用域 && 生命周期:

  1. 全局变量、全局作用域,生命周期:整个程序

  2. 全局静态变量、文件作用域,生命周期:整个程序

  3. 局部变量:局部作用域,生命周期:局部

  4. 局部静态变量:局部作用域,生命周期:整个程序

嵌套的作用域:

  1. 嵌套的作用域内(全局&&局部):内层作用域中的变量将覆盖外层作用域中的变量。同名的变量将引用内层作用域中的变量。当离开内层作用域时,外层作用域中的变量将再次可见。

函数分类 && 作用域 && 生命周期:

  1. 全局函数:全局作用域,生命周期:整个程序

  2. 成员函数:类作用域,生命周期:与所属对象相关联。

链接性 && extern:

  1. external,外部链接属性。全局作用域,对整个程序都是可见的,包括命名空间作用域 中全局作用域的变量

    1. 非常量全局变量和(除成员函数以外的函数)均默认为外部链接的,包括命名空间中定义的

  2. internal,内部链接属性。文件作用域,其他源文件中不可见
    1. const对象,constexpr对象,命令空间内的静态对象
  3. none,类 / 局部 / 块 作用域 仅在定义的位置可见
    1. 在类中、函数体和代码块中  声明的变量默认是具有none链接属性。它和internal一样只在当前作用域可见。
  4. extern仅可以声明外部链接属性的变量 / 函数 / 类

关键字static

  1. static修饰全局变量,作用域限制为文件,生命周期:整个程序。修饰局部变量时,作用域局部,生命周期:整个程序。
  2. static修饰成员变量或函数,作用域为类
  3. 普通成员函数可以访问static的变量,静态成员函数只能访问静态成员变量,
  4. this指针指向调用对象的起始地址:普通成员函数通过this指针,可以访问对象的非静态成员变量。而静态成员函数静态成员函数不属于任何对象,没有this指针,因此不能直接访问非静态成员变量。

const:

  1. const将全局变量作用域限制为文件,但可以extern到其他文件。
  2. 限定参数:函数中不能修改该参数 
  3. 限定成员函数的修改:修饰成员函数,该函数不能修改其类的成员变量  
  4. 限定返回值特别时返回值为指针或引用时,不能用返回值来改变返回值所指或所引用的变量

命名空间:

  1. 为什么使用:不同程序员开发不同模块,使用相同命名,那么发生定义冲突,为了防止命名冲突,将全局作用域划分为不同的区域
  2. 注意定义问题:同一个项目不同文件可以包含相同命名空间,但是内部的成员需要不同
  3. 注意:如果定义并使用两个相同成员,在编译器会发生重定义错误,如果不使用,仅会在运行时报错

内存分配方式:

  1. 静态分配(静态存储区),自动分配(栈),动态分配(堆)

动态内存:

  1. 利用指针通过new(为对象开辟内存) 运算符指向对象地址,提供了灵活的方式来管理对象和变量的生命周期,手动创建和销毁delete(释放指针指向地址对应的内存)对象。动态分配的变量的生存期不受其作用域的限制。

多重 包含 / 定义错误:参考

  1. c++将代码分为文件进行编译,现在彻底理解一下
  2. 编译和链接:编译阶段是针对一个一个文件来说的,a.h,a.cpp编译为一个a.o,而链接则是针对一个工程所有的.o(.obj)文件而言,链接Link为c组成一个可执行文件
  3. #include:拷贝文件,在编译阶段,a.h,a.cpp如果#include "b.h",相当于把b.h拷贝到a文件中,编译为一个a.o。
  4. 重复包含:
  5. 当一个文件重复include同一个文件,会发生重复包含错误,通过#ifndef,#define,#endif或者#pragma once(微软编译器独有的,不支持跨平台)保证了,同一个文件不会被包含多次。
  6. 注意:这类防止重复包含问题的,并不会解决重复定义错误
  7. 重复定义:
  8. 头文件中不要定义变量,仅extern变量:当h文件定义一个变量/ 函数 / 类,不同cpp去include这个文件,编译阶段没有问题,但是链接时会重定义错误。如果仅声明,声明多次是没问题的。
  9. 当非include的问题:对于外部链接性的变量或函数,都不要定义同名的,在链接时会出现错误,对于文件作用域的没问题
  10. 为什么h中的class没有重定义问题:因为仅仅是类声明
//变量
int x;//定义 + 声明
extern int x;//仅声明
//函数
void fun();//声明
void fun(){};//声明
void fun(){}//定义(后面无;)
//类 / 结构体
class A {//类声明public://定义:成员变量 / 函数private:
};
A a;//定义

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

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

相关文章

2025届阳光保险集团应届生校招社招入职测评真题题库北森自适应测评题库

第1题 人类使用塑料袋的历史很短,但对塑料袋的指责却不绝于耳。全世界每年要消耗5000亿到1万亿个塑料袋。废弃的塑料袋被掩埋会影响农作物吸收营养和水分,污染地下水;焚烧塑料袋则会产生有毒气体,影响人体健康。因此如何处理塑料袋十分重要。…

大数据学习-Hive 函数

目录 Hive函数 Hive的内置函数 数学函数 取整函数: round 指定精度取整函数: round 向下取整函数: floor 向上取整函数: ceil 取随机数函数: rand 幂运算函数: pow 绝对值函数: abs 字符串函数 字符串长度函数:length 字符串反转函数:reverse 字…

微信小程序常用标签及其用法

大家好&#xff0c;我是linzi&#xff0c;今天我来给大家分享一下微信小程序一些个常用的标签及其用法 1. <view> 标签 <view> 标签是小程序中最常用的标签之一&#xff0c;用于组织和布局页面上的内容&#xff0c;类似于HTML中的 <div> 标签。 <view …

STM32——温湿度采集与显示

一、I2C协议 关于I2C协议的基本原理和时序协议 12C协议使用两条线&#xff1a;SDA&#xff08;Serial Data Line&#xff0c;串行数据线&#xff09;和SCL&#xff08;Serial Clock Line&#xff0c;串行时钟线&#xff09;。这两条线都是开漏输出&#xff0c;意味着它们需要上…

NTP对时-客户端程序

#include <QObject> class QUdpSocket;#if 0 // NTP协议帧&#xff08;未使用&#xff09; typedef struct {char LI_VN_Mode;char Stratum;char Poll;char Precision;int RootDelay;int RootDispersion;int ReferenceIdentifier;quint64 ReferenceTimeStamp; …

【AI作曲】毁掉音乐?早该来了!一个网易音乐人对于 AI 大模型音乐创作的思辨

引言&#xff1a;AI在创造还是毁掉音乐&#xff1f; 正如当初 midjourney 和 StableDiffusion 在绘画圈掀起的风波一样&#xff0c;suno 和 各大音乐大模型的来临&#xff0c;其实早该来了。 AI 在毁掉绘画&#xff1f;或者毁掉音乐&#xff1f; 没错&#xff0c;但也错了。…

MGV电源维修KUKA机器人电源模块PH2003-4840

MGV电源维修 库卡电源模块维修 机器人电源模块维修 库卡控制器维修 KUKA电源维修 库卡机器人KUKA主机维修 KUKA驱动器模块维修 机械行业维修&#xff1a;西门子系统、法那克系统、沙迪克、FIDIA、天田、阿玛达、友嘉、大宇系统&#xff1b;数控冲床、剪板机、折弯机等品牌数控…

语音相关算法学习整理

最近看了一下百度paddlespeech的一些公开课&#xff0c;把课程里的视频内容大体听了一下&#xff0c;现在整理一下笔记。教程链接见&#xff1a;飞桨AI Studio星河社区-人工智能学习与实训社区 语音识别的过程可以这样简单概括&#xff1a; 将声音信号经过预加重、加窗、fft等…

JavaWeb——Mysql的启动/登录/卸载

目录 1.Mysql服务器 2.Mysql的简单使用 2.1 启动Mysql&#xff1a; 2.2 登录Mysql 2.3 退出 3. 连接别人的数据库 4.卸载mqsql 1.Mysql服务器 安装了Mysql的计算机都成为Mysql服务器 2.Mysql的简单使用 2.1 启动Mysql&#xff1a; 第一种方法&#xff1a;搜索服务&am…

如何在微信小程序使用vant 进行自定义底部tabbar组件

在微信小程序中使用 Vant 自定义底部 TabBar 需要进行以下步骤&#xff1a; 一、首先&#xff0c;你需要在 app.json 文件中配置自定义 TabBar。 在 "tabBar" 字段中&#xff0c;设置 "custom" 为 true&#xff0c;表示使用自定义 TabBar。 app.json示例…

python18 正则表达式

python18 正则表达式 正则表达式 re.match(),re.search(),re.findall(),re.sub(),re.split() 元字符 具有特殊意义的专用字符 导入模块 improt re代码 正则表达式 re.match(),re.search(),re.findall(),re.sub(),re.split() 元字符 具有特殊意义的专用字符 导入模块 improt rei…

AQS和同步器工具类

一、 同步框架AbstractQueuedSynchronizer Java并发编程核心在于java.concurrent.util包 而juc当中的大多数同步器实现都是围绕着共同的基础行为&#xff0c;比如等待队列、条件队列、独占获取、共享获取等&#xff0c;而这个行为的抽象就是基于AbstractQueuedSynchronizer简称…

关于多线程的理解

#系列文章 关于时间复杂度o(1), o(n), o(logn), o(nlogn)的理解 关于HashMap的哈希碰撞、拉链法和key的哈希函数设计 关于JVM内存模型和堆内存模型的理解 关于代理模式的理解 关于Mysql基本概念的理解 关于软件设计模式的理解 关于Redis知识的理解 文章目录 前言一、线程…

Docker基本使用和认识

目录 基本使用 镜像仓库 镜像操作 Docker 如何实现镜像 1) namespace 2) cgroup 3) LXC Docker常见的网络类型 bridge网络如何实现 基本使用 镜像仓库 镜像仓库登录 1)docker login 后面不指定IP地址&#xff0c;则默认登录到 docker hub 上 退出 2)docker logo…

P5711 【深基3.例3】闰年判断

1. 题目链接 https://www.luogu.com.cn/problem/P5711 P5711 【深基3.例3】闰年判断 2. 题目描述 题目描述&#xff1a;判断一个数是否是闰年 输入&#xff1a;输入一个整数n 输出&#xff1a;输出1或0&#xff0c;如果是闰年&#xff0c;输出1&#xff0c;否则输出0 3. 我的…

大数据经典sql

一、连续登录问题 问题&#xff1a;1&#xff09;、每个用户连续登录最大天数 2&#xff09;、连续登录大于三天的用户数 分析&#xff1a;本质都是计算用户连续登录天数 方案一&#xff1a;利用排序窗口 select a.user_id,a.date_rslt,count(1) as cnt from (select t.…

进入容器修改内容_提交改变后的镜像_镜像保存成tar压缩包离线传输_镜像传输_镜像推送到公共仓库---分布式云原生部署架构搭建009

然后再来看,进入docker内部去看看. 用 docker exec -it imgid /bin/bash 这样就可以进入容器内部 而且关于,镜像的,内部放到什么地方了,都可以找到比如 在hub.docker的地址里面,找到nginx可以看到,对应的 /usr/share/nginx/html 可以看到这个路径. 然后去看看,进入到/usr…

Android 数据库

帮助类对象中的getWritableDatabase 和 getReadableDatabase都可以帮助我们获取一个数据库操作对象SqliteDatabase. 区别&#xff1a; getReadableDatabase: 先尝试以读写方式打开数据库&#xff0c;如果磁盘空间满了&#xff0c;他会重新尝试以只读方式打开数据库。 getWr…

如何恢复未格式化分区数据?看这里!

什么是未格式化分区&#xff1f; 未格式化或RAW文件系统的分区无法被Windows操作系统识别和挂载&#xff0c;因此&#xff0c;Windows会提示你进行格式化以创建新的文件系统。注意&#xff0c;不要进行格式化。通常&#xff0c;文件系统变为未格式化或RAW会出现以下常见错误消…

专业VS学校:高考后的选择困境与解决之道

随着2024年高考的落幕&#xff0c;数百万考生站在了人生新的十字路口。分数的揭晓&#xff0c;既是对过往努力的肯定&#xff0c;也带来了新的选择难题。在专业与学校的权衡中&#xff0c;考生们往往陷入两难&#xff1a;是追随内心选择心仪的专业&#xff0c;还是选择一个知名…