问:这里的extern到底是什么类型?怎么允许重复定义?
答:
extern的功能是告诉编译器:如下变量的类型和名字已在别处声明过了,不必再为它们分配内存。当将两个模块连在一起的时候,链接程序将解决对所有外部变量的引用。
#include <iostream>
using namespace std;
int main(){
extern int x;
cout<<x<<endl;
cout<<"hello world"<<endl;
return 0;
}
//x.cpp
int x=5;
int newfunc(){
x=3;
return 0;
}
结果:
5
hello world
Press any key to continue
将x.cpp也加入项目中,另外x.cpp里面应该不能再有main函数了。
这两个文件可以分开编译,但最后还是要在一起链接。
另外,external还有如下的使用规则:
问:为什么说只有那三个声明没有定义哪?
好像也没有定义阿
答:
definition的定义是:any declaration that specifies a value is a definition.
所以这两个变量之所以成为表达式,肯定是有初值的,这个初值不是被显式赋予的,而是由于c++的体系保证了char和string类型的变量能够被自动初始化。
问:这一句:
为什么只有第一个成员声明了类型,难道三个相同类型的成员可以只声明第一个吗?
如果后两个相同哪?
另外struct里面的成员不是用分号分割吗,怎么变成逗号了?
答:
Struct与类类似,可以有成员、构造函数,析构函数等。
另外需要注意的是,c++中的成员默认是public的。
问:这一句:
里面的typedef与一般的定义于什么区别?与类的定义有什么区别?
里面的complex是什么意思?为什么不写维数就知道是二维的?
答:
typedef参看这篇文章:http://www.cnblogs.com/time-is-life/articles/832401.html
关于complex:
Ø complex不是C++的一种基本数据类型,但stl类库提供一个complex(模板)类,实现复数运算功能
Ø typedef std::complex complexd;
std::complex c;
等才是正确的用法。
Ø 3. complex是模板类,short是参数,
complex<short>代表 short类型的复数
由于复数的格式是 ai+ bj的形式,所以可以代表一个点
问: 这段描述:
为什么不能在这里赋值,应该在什么时候赋值?
[答]
首先,这里给出了什么是defenition: any declaration that specifies a value is a definition.
所以,可以分析出这里的:
Char ch;
String s;
不是没有赋初值就成为了definition,而是因为c++的体系中保证了它们可以被自动初始化。
这里的char和string不像double和int那样的初始值是0,而是会随机分配一个地址,比如d23A,但是如果再初始化完毕以后马上输出的话,输出的都将是空字符串。
不同的编译环境变量的初始值是不一样的,取决于随机数以及上次被分配的值。
比如在Dev C++中,输入下面的代码:
int c;
cout<<c;
输出的结果为2.
所以在写程序的时候不要依赖变量的初始值,尽量自己赋初值。
下面看看相关章节的描述:
10.4.2中关于成员初始化的描述:
4.9.5中关于成员初始化的描述:
对于于4.9.5中提到的章节,引述如下:
第5.7节中的描述如下:
2.5.2地描述如下:
10.2.3 的描述如下:
12.2.2 的描述如下:
从最后一段代码可以看出:原来类里面的成员可以这样初始化。