借鉴相关文章:
[C语言]变量的声明和定义有什么区别 - Cookies_L - 博客园 (cnblogs.com)
(20条消息) C语言中变量的声明和定义_史凯凯的编程技术博客-CSDN博客_变量声明
C++函数声明和定义深度解析 - fenghuan - 博客园 (cnblogs.com)
一、变量的定义与申明
为变量分配地址的和存储空间的称为定义,不分配地址的称为申明
变量定义:用于为变量分配存储空间,还可为变量指定初始值,程序中,变量有且仅有一个定义
变量声明:用于向程序表明变量的类型和名字
1、extern通知编译器变量在其他地方被定义
extern告诉编译器变量在其他地方定义了
extern int Num; //声明,不是定义
2、带有初始化式的声明必定是定义
如果声明有初始化式,就被当作定义,即使前面加了extern。只有当extern声明位于函数外部时,才可以被初始化
extern double pi=3.14; //声明,也是定义,初始化
int Num = 10; //声明,也是定义,初始化
3、除非有extern关键字,否则都是变量的定义
int Num; //声明,也是定义,未初始化
二、函数的定义与声明
形象一点:声明就是让编译器知道有这么一个家伙,但需要稍后再具体介绍(定义)
double CalculateRound(double d1,int d2); //声明
double CalculateRound(double d1,int d2)//定义
{
double a ;
a = d1*d2*d2;
return a;
}
int main()
{
double Pi = 3.14;
int d = 2;
double add = CalculateRound(pi,d);//调用
printf("%f\n",add);
return 0
}
三、类的定义与声明
类可以抽象的按照结构体进行理解,类本身有申明,也有定义,类的成员函数/成员变量有声明和定义可以按照变量/函数的声明和定义理解
class B; //类B的声明
class A{
//....................
B * ptr_B;
};
class B{ //类B的定义
//....................
};
类(class)就是对象的类型。实际上,类也是一种数据类型,它包含属性和行为(函数)。
类定义时,关于内存是否分配存疑,查阅相关资料后:
1.对于一般的类(非静态)来说,在定义类但还未创建对象的时候,类的所有成员(包括变量和函数)2.都占用着 内存 空间(准确地说占用着指令代码区),但不占用堆栈空间
2.而创建对象的时候,会根据对象的类型占用堆栈的空间(用传统模式创建对象会占用栈空间,用引用+new模式创建对象会占用堆空间,同时引用会保存在栈里)
3.对于静态(static)类来说,静态类是不能实例化创建对象的,所有的成员都是静态成员,也需要占用内存空间,但不在堆栈里,而是在内存的静态/全局区(这个区域用于存放所有的全局成员和静态成员)。
四、对象的定义与声明
可以将对象看做变量,参考变量理解类的定义与声明,(在查阅了很多资料后,发现很多资料对于对象的定义与声明没有明确划分,部分资料将创建对象A a(1);理解为声明对象,与变量的声明有所不同,个人感觉有些模糊不清,虽然没有太影响使用但是很让人难受,所以询问了一下前辈,总结如上,或许书籍上有详细的说明分析)
类和对象的关系:
类与对象的关系就如模具和铸件的关系,类的实力化的结果就是对象,而对对象的抽象就是类,类描述了一组有相同特性(属性)和相同行为的对象。
创建对象的三种形式:(对象的定义)
在进程虚拟地址空间中的栈中分配内存,栈中内存的分配和释放是由系统管理
A a(1); //栈中分配 隐式调用
A b = A(1); //栈中分配 显示调用
堆中分配内存,堆中内存的分配和释放必须由程序员手动释放
A* c = new A(1); //堆中分配 实例化
delete c; //必须在程序中释放指针
总结这些后,想到extern是不是也可以用来声明函数、类和对象,然后查阅资料,总结后:
答案是可以的。
该篇文章是自己参考的网络上的资料和相关的博客进行的归纳总结,很难保证自己归纳的东西一定是完全正确的,有什么问题欢迎大家指出,相互学习。