声明,定义,初始化,实例化的详细解释

2023-12-20 07:12:36

引入:
先来了解变量声明和定义的关系
?为了可以把程序拆成多个逻辑部分来编写,通常支持分离式编译的机制,该机制可以允许我们将程序分割为多个文件,每个文件具有各自的作用,可独立被编译。
?如果将程序分为多个文件,就需要有在文件中共享代码的方法,一个文件的代码中可能需要使用另一个文件中的变量。举一个常见的例子就是C++中std::cout和std::cin,他们定义在标准库中,却能被我们写的程序使用。
?为了支持分离式编程,C++将声明和定义分开,声明使该名字被程序所知,一个文件想使用别处定义的名字就必须要包含对哪个名字的声明,定义则是负责创建与名字关联的实体。

也就是声明后,不一定有实体,而定义就是创建实体。
?变量声明规定了变量的类型和名字,定义也规定了变量的类型和名字,但是除此之外,定义还会申请空间,也可能为该变量赋一个初始值。
如果想声明一个变量而不是定义它,就在变量名前加上extern,而不是显式地初始化变量

extern int i; //声明i而不是定义i
int j; //声明并且定义

?但任何包含了显示初始化的声明即成为定义,我们给由extern关键字标记的变量赋上初始值,这么做就抵消了extern的作用。extern语句如果包含初始值就不再是声明而是定义了,因为我们给该变量创建实体以保存其初始化的数值。
说了很多,不如实践演示一波
在这里插入图片描述
这里的报错就是未声明标识符。是编译错误。
在这里插入图片描述
当我们给extern修饰的变量附上初始值,就会发现可以正常运行。
在这里插入图片描述
声明就像是给你一个承诺,但是我可能会忘记实现承诺,从而导致错误。
?你哥们要买房,过来告诉你借点钱,你刚好兜里有点,爽快的答应了,说过一会儿转到他的账上,但是一转眼你忘记了这件事,你哥们首付都交了,又打电话过来问你钱转了吗?怎么没收到,你忽然才想起来,然而你的小积蓄给女朋友买了一个大戒指,已经没有钱了,你和兄弟说完兄弟就崩溃了,答应是全款,这下没钱付,要付违约金,你哥们就崩溃了。这就是因为你定义了,说马上把钱打过去,然而你没打,哥们有钱吗?没有,哥们崩溃了。
?声明可以多次声明,你当然可以给多个哥们画大饼,不同的程序都可以得到来自你的声明,他们都觉得事情已经妥了,然而声明过来的变量却没有定义。许多程序(哥们)就崩溃了。
声明可以多次声明,但是定义只能有一次。变量的定义只能出现在一个文件中。
?总结一下就是声明和定义分离,可以使其他想用到该文件中某变量的文件通过声明使用该变量。
函数的声明和定义
我们可以类比变量的声明和定义,其实都一样的。
?还记得在C语言中我们写main函数外的函数都要放在main函数下边,不然就要在前边写一个函数声明吗?(先看现象,后挖掘本质)
举一个很常见的例子
在这里插入图片描述
此时程序正常运行
在这里插入图片描述
?此时就会报错,找不到Add函数,这是因为程序运行时是从上到下一次执行的,在main函数前边没有发现Add函数,所以会报错,我们要声明一下,告诉编译器我们写了Add函数了的。
在这里插入图片描述
?对于第一次运行是可以运行的原因就是,第一次运行时同时进行了声明和定义。
?对于函数,同样可以用extern修饰,但是extern可以省略。
在这里插入图片描述
在这里,声明和定义的关系我想你已经烂熟于心了。
类的声明和定义
这里只谈类的声明和定义,深入了解一下?类和对象
类的声明和定义不同于前边。
?我们可以仅仅声明一个类暂时不定义他,这种声明称为前向声明,他在声明之后定义之前是一个不完全类型。
?如果看了前边我所推荐的文章就可以更加理解,对于不完全类型,使用场景十分有限,由于他没有实体,编译器无法知道存储该数据成员需要多少空间,所以类必须先被定义,然后才能引用或使用指针访问其成员。
在这里插入图片描述

?类的定义必须要有类名和类体,类体中的变量称为类的属性和成员变量,类中的函数称为类的方法或者成员函数。
类的两种定义方式:

  1. 声明和定义全部放在类体中,需注意:成员函数如果在类中定义,编译器可能会将其当成内
    联函数处理。
class Person
{
public:
	void Print()
	{
		cout << "hello" << endl;
	}

	int _age;
	int _grade;
};
  1. 类声明放在.h文件中,成员函数定义放在.cpp文件中,注意:成员函数名前需要加类名::

在这里插入图片描述

初始化的概念
?初始化在计算机编程领域中指为数据对象或变量赋初值的做法,初始化和声明是有明显区别的,变量声明一定是先于初始化进行的,一个包含初始化的声明则通常被称为定义。
?C++定义变量时如果没有给其赋初始值,会根据其位置判断要不要给他默认初始值。默认初始值由该变量的类型来确定。
?如果在任意函数外定义的变量赋值为0,定义在函数内部的内置类型不被初始化,一个没有被初始化的内置类型的值是未定义的,如果试图拷贝或者以其他形式访问该类值将会引发错误。
如图
在这里插入图片描述
如果将下边的放开

在这里插入图片描述

?在C++中,初始化用=号的方式,很容易让人们认为初始化是赋值的一种,然而初始化和赋值完全是两种不同的操作,人们很容易把二者的区别混为一谈。
?初始化不是赋值,初始化的含义是创建变量时赋予其一个初始值,而赋值的含义是把对象非当前的值擦除,用一个新的值来代替。
一个变量只会初始化一次,再次就是赋值,不然就会重定义。
在这里插入图片描述
如果再次初始化就会报错
在这里插入图片描述
实例化的概念
?实例化是指在面向对象编程中,用类创建对象的过程,是将一个抽象的概念类,具体到该类实物的过程。
在这里插入图片描述

?定义一个类,但是并没有有分配实际的内存空间来存储它。一个类可以实例化出多个对象,实例化出的对象 占用实际的物理空间,存储类成员变量。
?做个比方。类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图,只设计出需要什么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间。

?本文到这里就结束啦,有用的话留一个赞再走叭,如果你的慧眼金睛发现了问题,一定要说哦,我会虚心改正哒。

文章来源:https://blog.csdn.net/qq_75270497/article/details/135086189
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。