c++:class,名字空间等
一.名字空间
C语言中的名字空间的划分:全局,局部,块
C++认为全局空间用起来非常方便,但如果把太多的东西放在全局空间中,会造成命名冲突,所以引用
了一种机制就是名字空间;
名字空间:把全局的命名空间进一步分割,可以创建出一个个独立的命名空间防止相互之间的冲突
1. 定义名字空间:
namespace name
{
变量
函数
结构,类
}
使用: name::变量
2. 名字空间的合并
a. 同名的命名空间会自动合并
b. 在同一个名字空间中只是标识符必须是唯一的
3. 定义与声明分开
namespace n1 //在名字空间中声明函数
{
void func(void)
}
//在名字空间中定义函数
void n1::func(void)
{
}
4. 如何使用名字空间中的内容
1. 域限定符(::)直接使用,名字空间::标识符
2. using namespace 名字空间;功能是把名字空间中的标识符对之后的代码全部公开
3. using 名字空间::标识符,表示此标识符对后面的代码公开
5. 名字空间的嵌套
名字空间可以嵌套,但使用的时候要逐层解析
namespace nn
{
int n = 10;
namespace nm
{
int n = 20;
namespace mm
{
}
}
}
6. 默认全局空间归属为匿名空间
在全局空间定义的标识符都属于这个匿名空间,匿名空间默认开放
如果函数中有重名的标识符,会把匿名空间中的屏蔽了。可以使用空的域限定符表示它
注意:不同命名空间中的同名函数不构成重载,重载必须发生在同一作用域下;
二.class
1. C++的class与struct一样,是一种复合数据类型
2. 里面可以有变量用来表达属性,函数用来表示行为;
3. 在C++中的class与struct,几乎没有任何区别
4. struct 默认访问属性时public,class中的默认的访问属性是private,
5. 在C++中默认使用class,以示与C语言中的struct进行区分
三.class的构造结构
1. 在创建对象时自动调用的函数,在整个对象的生命周期中一定会被调用一次,且只能被调用一次;
2. 在构造函数中负责对成员变量的初始化,分配资源,设置对象的初始状态
3. 构造函数可以有多个版本,他们之间会构成重载,创建对象时方法不同,给的参数不同会调用相应的构造函数
如果调用的构造函数不存在就会造成编译错误
//无参构造
Student stu <=> Student *stu = new Student
4. 如果类中没有定义构造函数,编译器会自动生成一个无参构造
一旦定义了其他版本的构造函数,无参构造就不会生成了,因此为了防止无参方式创建对象出错,在定构造函数时,至少要实现两个
5. 无参构造未必无参,在C++中函数可以有默认参数,如果有参构造全部设置了默认参数,就会和无参构造有冲突,他们两个只能用一个
6. 所谓的"编译器生成的某某函数",并不是真正意义上的函数,编译作为指令的生成者,只要生成具有
某些函数的功能的指令即可,没有生成高级语言的主义以上的函数
7. 什么时候调用无参构造
1. Student stu <=> Student *stu = new Student
2. 创建对象数组,每个对象都会调用一次无参构造
3. 如果类A中有成员类B,当执行完类A构造函数前,就执行类B的构造函数
4. 在类A中如何调用类B的有参构造
类A(参数列表):成员类B(参数列表)
{
...
}
8. 类型转换构造函数
用一个数据给对象初始化,默认会自动调用构造函数,达到类型转换的效果
这种方式虽然使用方便,但也会包容一些错误存在,如果想让代码检查更为严格可以使用explicit关键字禁止隐式转换的方式调用构造函数
9. 也可以实现自动类型转换构造函数(默认的)