OOP02:Using Object
第2章 Using Object
2.1 string
|
2.2 File I/O
|
2.3 内存结构
全局变量Global Vars:
- 在函数外定义
- 可以通过extern,分享给不同的*.cpp文件
extern:
- 声明,在整个工程中会有这样一个变量
- 声明了变量的类型、名称
static global var:
- 禁止被其他*.cpp文件访问
- 包括static变量、static函数
static local var:
- 保存了在不同次访问函数时,需要被保存的变量
- 在第一次访问函数时,变量被初始化
2.4 Pointers to Objects
string s = "hello"; |
&:取地址
ps = &s; |
*****:得到对象
(*ps).length(); |
->:调用函数
ps->length(); |
两种访问对象的方法
string s; // s是对象本身, 会将对象s进行初始化 |
赋值
string s1, s2; |
2.5 动态分配内存
动态分配内存:保存在堆空间
// 分配内存: new--申请内存, 然后调用对象的构造函数 |
动态数组:
int *psome = new int[10]; |
注意:
int *pArr = new int[10]; |
要求:
- 不要delete不是被new分配的内存
- 不要delete同一个内存两次
- 如果new [],要用delete []
- 可以delete一个空指针
2.6 引用 Reference
用法:对一个已经存在的对象,生成一个新的名字
// 定义,定义后,访问r <==> 访问c |
例:
string s1("Hello"), s2("World"); |
Pointers vs References:
Pointers
- 可以是null
- 不依赖于已经存在的对象
- 可以修改指向不同地址
References:
不能是null,定义时必须初始化
依赖于已经存在的对象
定义后,不能指向其他对象
指向的对象必须有地址,不能是表达式等临时变量
void func(int &);
func(i * 3); // 非法
Reference的限制:
引用本身不是对象,因此无法定义引用的引用:
int x = 100;
int &rx = x;
int &(&rrx) = rx; // 非法不能用指针指向引用对象:
int& *p
是非法的,但是可以int* px = &x;
可以对指针生成一个引用:
int* &p
是合法的不能定义引用的数组:
int& x[100]
是非法的
2.7 常量 const
// 定义, 定义后x不能修改 |
使用const代替宏定义常量,优点:
- 有作用域
- 宏是强替换,而const是一个变量
编译器对const的处理:
- 编译器会尽量避免为const变量分配内存,而是放入符号表中
- extern的const变量,会被分配内存
const int bufsize = 1024; |
- 编译时常量:在编译期间可以决定取值的常量
- 运行时常量:在运行期间才可以确定取值的常量
const int bufsize = 1024; |
2.8 聚合 Aggregates
2.8.1 常量数组
const int i[] = { 1, 2, 3, 4 }; |
2.8.2 Pointers and const
// 指针本身不被更改: q is const |
Pointers and constants:
int i | const int ci = 3; | |
---|---|---|
int * ip; | ip = &i; | ip = &ci; //不合法 |
const int * cip; | cip = &i; | cip = &ci; |
*ip = 54; // 永远是合法的,因为ip指向的是int |
2.8.3 String Literals
// 这里s指向了一个字符串常量, 但现在的编译器通常会对这种写法报编译错误 |
2.8.4 常量与非常量的转化
非常量 ==> 常量:可以直接转化
void f(const int *x); |
常量 ==> 非常量:使用const_cast关键字
|
2.7.5 传递并返回参数的地址
- 传递一整个对象,代价会非常大。我们应该传递对象的地址,而非对象
- 但是此时,会导致函数可以修改原始对象
- 事实上,如果需要给函数传递一个地址,我们需要将其设置为const
void f(const int *x); |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 华风夏韵!
评论