首页 > 编程语言 >C++声明、定义、初始化

C++声明、定义、初始化

时间:2023-10-12 22:44:59浏览次数:53  
标签:初始化 定义 int C++ extern 声明 变量

声明

  声明可声明多次,而编译器不会为其分配存储空间。目的是为了使编译器知道该标识符所代表的含义及原型所在,文件与文件之间 使用关键字 extern 修饰变量或函数称为声明(引用)可使同工程目录下的变量或函数实现交互 说明符 + 表达式列表

定义

  一般的情况下,把建立空间的声明称之为定义,而把不需要建立存储空间的声明称之为声明。

int a = 1; // 定义

int main() {
	int b; // 也是定义,因为建立了存储空间
	extern int a; // 声明定义在别处的变量,仅仅是声明,没有建立空间
}

  a 被声明了两次,第一次声明为变量预留了存储空间构成了定义。称为定义式声明。第二次声明只是使用之前的变量,而没有创建空间所以仅仅是声明。

  extern关键字只能做声明,不能定义。有extern关键字都是声明,其它情况都是变量的定义。

初始化

  变量的初始化: 为变量声明或者定义之后,赋上初值的过程,就是变量的初始化。

定义、声明、初始化的区别

// 对于全局变量
extern int a;		// 仅仅是声明
int a = 4;			// 定义 + 初始化
int a; 				// 可能是定义也可能是声明,因为该全局变量未初始化,如果其他文件中定义了该变量,则该变量为弱符号,则为声明,否则为强符号,为定义。

// 对于局部变量
int a; 				// 一定是定义,因为这时已分配内存空间
a = 4; 				// 赋值

  下面这个叫做赋值,因为在定义变量时,并没有赋值

int b; // 声明/定义 变量
b = 2; // 初始化变量

静态变量初始化

  静态变量(被static关键字修饰过的变量)默认将值初始化为0。可执行程序载入到内存时,已经保存了正确值的位置,会将值赋值给变量。完成这个任务不需要额外的时间与指令,静态变量就会初始化完成。

自动变量初始化

  自动变量(可以简单理解为局部变量)不会被初始化为0。程序在链接时还无法判断自动变量的存储位置,因为局部变量可能在函数中每次调用时占据不同位置。所以自动变量会使用更多开销。

  • 自动变量的初始化和声明然后赋值,效率一样,无差别。
  • 静态变量每次只在程序执行时初始化一次,而自动变量在每次执行到所在函数时都会进行一次初始化。
  • 因为自动变量初始化在运行时才执行,你可以用变量给他初始化, 而静态变量不能使用变量来初始化 。
int a = 4;
int b = a + 3;
// static int c = a + 4; 编译报错
  • 建议对自动变量初始化,或者保证使用前赋值,不然它会有一个垃圾值是非预期的,会导致程序出现意料之外的bug。

    垃圾值演示

#include<iostream>
using namespace std;
struct T {
    int a;float b;string c;int d[100];int *e;
    friend ostream &operator<<(ostream &os, const T &t) {
        os << "a: " << t.a << " b: " << t.b << " c: " << t.c << " d: " << t.d << " e: " << t.e;
        return os;
    }};

int main(int argc, char const *argv[]) {
    // 产生垃圾值
    int a;
    float b;
    string c;
    int d[100];
    int *e;
    T f;
    e = &a;
////  初始化后不会产生垃圾值    
//    int a = 0;
//    float b = 0;
//    string c{};
//    int d[100] = {};
//    int *e;
//    T f{};
//    e = &a;
    cout << a << endl;
    cout << b << endl;
    cout << c << endl;
    cout << d << endl;
    cout << e << endl;
    cout << &a << endl;
    cout << f << endl;
    for (const auto &item: d){
        std::cout << item << std::endl;
    }
    return 0;
}

标签:初始化,定义,int,C++,extern,声明,变量
From: https://www.cnblogs.com/hhddd-1024/p/17760789.html

相关文章

  • C++内置函数用法
    1-substr函数(字符截取函数)格式1:substr(stringstring,inta,intb)string是需要截取的字符串;a是截取字符串的开始位置;(注:当a=0或1时,都是从第一位开始截取)b是要截取字符串的长度;格式2:substr(stringstring,inta)string是需要截取的字符串;a可以理解为第a个字符开始截取后面所有......
  • 关于如何解决visualc++6.0打开文件闪退的一种方式(附带解决输入法无法显示)
    这里我把VisualC++6.0安装程序和filetool分享在我的网盘里面了网盘下载QAQ链接:https://pan.baidu.com/s/1azSMX_cOKgb64WT7-gTdbQ?pwd=ayxs提取码:ayxs 下载后解压文件,运行filetool.exe 进入Visualc++6.0,我们要运行并打开这个filetool里的工作空间  然后单击工......
  • c++中的继承(上)
    继承的定义继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设......
  • odoo字段定义中使用其他字段值
    odoo字段定义的时候,可以使用同模型中其他值进行操作,下面列举常用的操作用作related计算字段1=fields.Char(related='字段2.字段xxx')字段2=fields.Many2one('模型名')如果字段2是关系型字段many2one,引号中可以用点.引用该字段对应模型的其他字段值,如果是普通字段,则只能......
  • C++ 11 auto关键字
    https://www.cnblogs.com/DswCnblog/p/5629048.html熟悉脚本语言的人都知道,很多脚本语言都引入了“类型自动推断”技术:比如Python,可以直接声明变量,在运行时进行类型检查。随着C++11标准的发布,C++语言也引入了类型自动推断的功能,这就是我们今天要介绍的auto关键字。C++是一种强......
  • 直播平台源代码,自定义设置 View 四个角的圆角 以及边框的设置
    直播平台源代码,自定义设置View四个角的圆角以及边框的设置使用贝塞尔曲线 typedefNS_OPTIONS(NSUInteger,UIRectCorner){  UIRectCornerTopLeft   =1<<0,  UIRectCornerTopRight  =1<<1,  UIRectCornerBottomLeft =1<<2,  UIRectCo......
  • Code-C++-chrono to tm (format time)
    Code-C++-chronototm(formattime)std::chrono::system_clock::time_pointnow=std::chrono::system_clock::now(); std::time_tnow_time_t=std::chrono::system_clock::to_time_t(now); std::tm*now_tm=std::localtime(&now_time_t); charbuffer[128......
  • Code-C++-Snowflake
    Code-C++-Snowflake#include<iostream>#include<chrono>#include<stdexcept>classSnowflake{private://雪花算法的各个参数staticconstexprint64_tworkerIdBits=5;staticconstexprint64_tdatacenterIdBits=5;staticcons......
  • C++ 11 Lambda表达式
    C++11Lambda表达式 C++11的一大亮点就是引入了Lambda表达式。利用Lambda表达式,可以方便的定义和创建匿名函数。对于C++这门语言来说来说,“Lambda表达式”或“匿名函数”这些概念听起来好像很深奥,但很多高级语言在很早以前就已经提供了Lambda表达式的功能,如C#,Python等......
  • 开发者笔记 C++11新特性并发编程future
    上一篇介绍了<thread>文件里线程相关类,这篇将介绍C++<future>头文件里线程类,future里包含的类主要是处理异步任务,线程函数封装,线程间通信,同步,捕捉异常处理https://zhuanlan.zhihu.com/p/509118687future的引入c++11引入的future是为了解决异步通信问题的。future可以看做是数......