一、名字空间
1、名字空间的由来:由于全局空间(即全局变量)用起来非常的方便,但如果过多的在全局空间定义变量,有很大的可能会引起重名。因此,C++就引入了名字空间的概念。
2、名字空间的含义:名字空间就是为了给程序员更好的管理变量,因此C++可将全局空间分成一个个独立空间,并给每个独立空间取不同的名字。这样就能很大程度的保证,同一个名字空间的名字不重名,以防止冲突。
3、如果两个名字空间取相同的名字,那么这两个名字空间就会被合并成一个名字空间,因此在给名字空间取名字的时候要小心些。
4、名字空间不仅可以定义变量,还可以声明函数,不过函数的定义要在名字空间外
5、使用域限制符(::)可以直接访问名字空间的内容。 例如,名字空间::标示符,不过会有些麻烦。
不过可以使用using namespace 名字空间;不过不建议使用在自己定义的名字空间,以免发生变量、函数、类等的冲突。
6、注意:不同的命名空间下的相同名字是不会构成重载的,相同作用域下的相同名字才会构成重载。
二、类(class) 注:类就是class,class就是累
1、C++中的class其实与C++中的struct结构体区别不大,但为了区分C++与C,一般在C++中都使用class
2、C++中class与struct的一些区别在于,struct结构体中成员默认访问属性的是public公开的,而class类中成员默认访问属性的是private私有的。
三、class的构造函数
1、在创建对象时自动调用的函数,在整个生命周期一定且只能调用一次。
2、在构造函数中负责对成员变量进行初始化、分配资源、设置对象的初始状态。
3、构造函数可以有多个版本,不同的构造函数之间不会构成重载,编译器通过创造对象的方式和参数的设置来判定选择哪个重载函数。
4、如果没有定义构造函数,编译器会自动生成一个构造函数。若自定义构造函数,编译器则不会生成构造函数
5、一般来说,编译器自动生成的构造函数都是够用的,除非有成员是指针,指向额外的空间,这时候就需要自定义构造函数了
6、一般情况下,构造函数的有4个版本:a、无参构造函数 b、有参构造函数 c、拷贝构造函数 d、赋值构造函数 e、转换构造函数
四、无参构造函数与有参构造函数
1、无参构造函数指的是在创建类时,没有参数传递。有参构造函数指的是在创建类时,有参数值传递。
2、一旦构造了一个构造函数,编译器就不会产生无参函数,所以在编辑时,最好多写一个无参构造函数,以防止创建对象出错。
3、在自定义有参构造函数时可以默认参数,因此有可以在创建类时没有参数传递给构建函数,因此有可以出现冲突。(编译器不知道选择调用无参函数还是有参函数)。
4、有参构造的调用:
a、直接调用,创建类时不给参数;例如 Student stu = new Student;
b、创建数组对象时,每个对象都会调用一次无参构造
c、如果累A中有类B,那么在执行类A时,执行到类B的创建时,会自动调用无参构造
d、在类A中调用类B的有参构造:类A(参数列表):类B(参数列表)
五、拷贝构造函数
1、拷贝构造函数是一种特殊的构造函数,就是以一种已有的对象去构造同类的副本对象,跟克隆一样。
2、自定义拷贝构造函数:
a、申请所需的空间
b、拷贝赋值
3、拷贝构造函数的调用:
a、对象与对象赋值
b、用对象与函数的传参
c、用对象当做返回值
d、类A中有类B时,类A在执行拷贝构造函数时,会自动调用类B的拷贝构造函数
六、赋值构造函数
1、赋值构造就是给一个已经创建过的对象赋值上另一个已经创建过的对象。
2、自定义赋值构造函数的步骤:a、确定赋值构造函数的类型
b、防止自赋值
c、释放旧资源
d、调用拷贝构造函数或者直接写拷贝函数的步骤
3、赋值构造与拷贝构造的区别:
赋值构造函数:对象A与对象B都已生成;B = A
拷贝构造函数:使用已有的对象A去创造对象B(调用时的对象B还未生成)
六、转换构造函数
1、用一个数据给对象初始化,默认会自动调用构造函数,达到类型转换效果。
2、编译器默认会实现自动类型转换构造函数。