extern的用法:
.cpp 1
#include <iostream>
using namespace std;
extern int i;
int main(int argc, char** argv) {
cout << i << endl;
return 0;
}
.cpp 2
#include <iostream>
int i = 100;
注意:在测试的时候.cpp 2没有加头文件#include<iostream> 导致编译报错。
另外的:
const限定符
除了将其修饰的对象变为常量对象外,还有其他的特点:
1,因为const对象一旦创建后其值就不能改变,所以const对象必须初始化。
2,默认状态下,const对象仅在文件内有效。
当多个文件中出现了同名的const对象时,其实等于在不同文件中分别定义了独立的变量。
当const对象确实有必要在文件中共享时。解决的办法是,对于const变量不管是声明还是定义都添加extern
关键字
.cpp 1
#include <iostream>
using namespace std;
extern int i;
extern int bufSize;
int main(int argc, char** argv) {
cout << i << endl;
cout << bufSize << endl;
return 0;
}
.cpp 2
#include <iostream>
extern const int bufSize = 100;
int i = 10;
-----------------------------------------------------------------------------------------
使用指针时:
int *p = 42; // 错误,解引用的操作仅适用于那些确实指向了某个对象的有效指针;
int ival;
int *p = &ival;
*p = 42; // 正确!
-----------------------------------------------------------------------------------------
引用和指针的基本区别:
1,引用在定义的时候必须初始化;指针不用。
2,应用是对一个对象的绑定,可以看做是一个对象的别名;指针是一个确实的的对象,可以进行对对象的各种
操作(左值)
3,指针在其生存周期中可以改变指向的对象,而引用只能指向一个对象。
误区代码:
#include <iostream>
using namespace std;
int i = 100;
int q = 10;
int main() {
int &u = i;
int *p = &i;
cout << u << *p << endl;
u = q; // 这里的u并不是改变了引用绑定的对象,而是改变了u/i的值,这是一个拷贝的过程。
p = &q; // 这里的p改变了指针指向的对象,指向q。
cout << u << *p << endl;
return 0;
}
---------------------------------------------------------------------------------------------------
const经典错误
#include <iostream>
using namespace std;
int main() {
int r1 = 2;
int &r2 = r1 * 2; // 错误,r2这时候绑定的是一个右值;
const int &r2 = r1 * 2; // 正确,cosnt修饰的引用可以绑定右值;
}
这里又回到了说指针和引用的不同:
指针除了继承部分的特殊情况外,初始化的时候类型必须严格匹配。
但是引用却有所不同,在算数类型中,引用允许类型之间的转换,但是由于转换的过程中会出现临时对象
即为右值;所以这时候应该遵守右值的绑定规则——普通的左值引用只能const绑定右值。
原文:http://www.cnblogs.com/xiaodukuko/p/5262840.html