"声明"的严谨C++语意,是用以告诉编译器类型及其细节,例如:
class Test
{
//数据成员细节...
//成员函数细节...
};
上述声明仅告诉编译器有自定义类型fish6344,编译器仅对其进行语法分析及名字的决议,并无内存实际占有!
"定义"的严谨C++语意,即内存占有,编译器将在相对内存地址上为其对象定址!要注意的是,我们不能简单的说:
string s;
是声明或是定义,应视具体情况而定,原则是,如果有内存的实际占有可确定是定义,否则是声明。例如:
classTest
{
string s1;
string s2;
};
上述Test类是个声明,并无内存占有(未实例化),s1及s2都是string型变量的声明而不是定义,Test都没有实体(可以为是虚幻的),哪儿有其成员的内存位置呢?只有实例化Test类以后,才会有内存占有。例如:
Test test;//在对象实体 test中有s1及s2的内存占有!
但是上述关于s1及s2的语句放在全局作用域或是另一实体的局部作用域,例如:
#include<iostream>
//全局作用域的:
string s2;//这是定义,s2是实例化的string!
int main()
{
//Main函数体内的:
string s1;;//这是定义,s1是实例化的string!
return 0;
}
二个string语句都是定义,这是典型的类型实例化!
class Test
{
//数据成员细节...
//成员函数细节...
};
上述声明仅告诉编译器有自定义类型fish6344,编译器仅对其进行语法分析及名字的决议,并无内存实际占有!
"定义"的严谨C++语意,即内存占有,编译器将在相对内存地址上为其对象定址!要注意的是,我们不能简单的说:
string s;
是声明或是定义,应视具体情况而定,原则是,如果有内存的实际占有可确定是定义,否则是声明。例如:
classTest
{
string s1;
string s2;
};
上述Test类是个声明,并无内存占有(未实例化),s1及s2都是string型变量的声明而不是定义,Test都没有实体(可以为是虚幻的),哪儿有其成员的内存位置呢?只有实例化Test类以后,才会有内存占有。例如:
Test test;//在对象实体 test中有s1及s2的内存占有!
但是上述关于s1及s2的语句放在全局作用域或是另一实体的局部作用域,例如:
#include<iostream>
//全局作用域的:
string s2;//这是定义,s2是实例化的string!
int main()
{
//Main函数体内的:
string s1;;//这是定义,s1是实例化的string!
return 0;
}
二个string语句都是定义,这是典型的类型实例化!