首页 > 编程语言 >c++ 多重包含/定义 || 链接性 || 生命周期

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

时间:2024-06-21 23:58:51浏览次数:13  
标签:文件 生命周期 变量 作用域 定义 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;//定义

标签:文件,生命周期,变量,作用域,定义,c++,链接,函数
From: https://blog.csdn.net/sengyongan/article/details/139872019

相关文章

  • c++ virtual || virtual =0
    虚函数&&纯虚抽象类:包含纯虚函数的类称为抽象类,继承层次结构的较上层。作用:将有关的操作作为结果接口组织在一个继承层次结构中,由它来为派生类提供一个公共的根,派生类将具体实现在其基类中作为接口的操作。继承:子类继承基类的成员及成员函数,不可以删除,可以(修改)通过虚函数重写......
  • 【C++】list的使用方法和模拟实现
    ❤️欢迎来到我的博客❤️前言list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素list与forward_list非常相似:最......
  • 2024年华为OD机试真题-分披萨-(C++/Java/python)-OD统一考试(C卷D卷)
    题目描述"吃货"和"馋嘴"两人到披萨店点了一份铁盘(圆形)披萨,并嘱咐店员将披萨按放射状切成大小相同的偶数个小块。但是粗心的服务员将披萨切成了每块大小都完全不同奇数块,且肉眼能分辨出大小。由于两人都想吃到最多的披萨,他们商量了一个他们认为公平的分法:从"吃货"开始,轮流......
  • c/c++ 数据结构 顺序栈
    本文是以c语言的风格编写的c++程序。栈的特点:先进后出,后进先出。顺序栈的结构定义:一个数组以及一个”指针“(不是真正的指针,而是位置变化的说明)#include<stdio.h>#include<malloc.h>#defineMaxsize20typedefstruct{ intdata[Maxsize]; inttop;}SqStack; 初......
  • 2020C++等级考试二级真题题解
     202012数组指定部分逆序重放c++ #include<iostream>usingnamespacestd;intmain(){  inta[110];  intn,k;  cin>>n>>k;  for(inti=0;i<n;i++){    cin>>a[i];  }  for(inti=0;i<k/2;i++){......
  • C++系统相关操作1 - 调用命令行并获取返回值
    1.关键词2.sysutil.h3.sysutil.cpp3.1.system_util_unix.cpp3.2.system_util_win.cpp4.测试代码5.运行结果6.源码地址1.关键词关键词:C++系统调用systempopen跨平台应用场景:希望直接调用操作系统的某些命令,并获取命令的返回值。2.sysutil.h#pragm......
  • C++系统相关操作2 - 获取系统环境变量
    1.关键词2.sysutil.h3.sysutil.cpp4.测试代码5.运行结果6.源码地址1.关键词C++系统调用环境变量getenv跨平台2.sysutil.h#pragmaonce#include<cstdint>#include<string>namespacecutl{/***@briefGetanenvironmentvariable.......
  • C++核心编程运算符的重载
    C++核心编程运算符的重载文章目录C++核心编程运算符的重载1.“+”运算符的重载1.1作为成员函数重载1.2作为全局函数重载2."<<"运算符重载2.1为什么需要重载左移运算符2.2如何重载左移运算符2.3注意事项3."++"运算符重载3.1前置递增运算符重载3.2后置递增运算符重载......
  • 2022年大作业参考报告-使用C++语言开发小学生成绩管理系统、中学生成绩管理系统、大学
    背景:目录第一章需求分析   21.1   问题描述   26.1   功能需求   26.2   开发环境   26.3   开发过程   2第二章概要设计   32.1   总体设计   32.2   类的定义   32.3   接口设计   52.4  ......
  • opencv入门-小白的学习笔记c++(1)
    注:以下是根据链接https://blog.csdn.net/Cream_Cicilian/article/details/105427752的小白学习过程。1加载、修改、保存图像1.1加载图像1.1.1加载图像cv::imread用于从文件中读取图像数据并将其存储到一个cv::Mat对象中,其中第一个参数表示图像文件名称第二个参数,表......