导航:
1、C++类和对象
2、构造函数和析构函数
3、this指针
4、C++关键字补充
类和对象
1、类是创建对象的模板,一个类可以创建多个对象,每个对象都是类类型的一个变量;创建对象地过程也叫做类的实例化。每个对象都是类地一个具体实例,拥有类的成员变量和成员函数。
2、与结构体一样,类相当于一种数据类型,类不占用内存。而对象是类这种数据类型的一个变量,占用内存空间。
3、类中有public、private、pritected三种访问权限。类的内部可以任意访问,但是类的外部只能访问public。
4、比如创建出一个Student类,定义对象时候可以有
Student stu;
class Student stu;(class可以省略)
Student *pstu = &stu;(要赋初值)
Student *pstu = new Student;(new后面跟类的名字,在堆区创建一个类的指针)--这里实际上省略了()。相当于调用构造函数。
Student allStu[00];------这个语句创建了一个有100个元素的数组,每个元素都是Student类型的对象。
5、new是在堆上创建对象,没有名字,只能得到一个指向它的指针,借助指针来访问它的成员变量和成员函数。
new和delete成对初出现。delete pstu;
6、成员函数必须先在类体中声明,可以在类中定义,或者在类体外定义。但是必须要定义,且成员函数声明必须要在定义之前。
7、内联函数:在类内部声明时,默认为内联。如果在类体外部定义为内联函数,可以在数据类型前面加上inline;
我感觉内联函数是用来提高函数调用效率的,如果要调用的函数里面的代码很少,资源都消耗在调用上,内联函数则没有消耗。
8、既然属性一般要设置成private属性(体现了封装性),那么外部如何访问呢?
可以添加两个public属性的成员函数,一个用来设置变量的值,一个用来获取。
9、如果不设置Public之类的权限,则默认是private属性。
10、构造函数
构造函数与类名名字相同,没有返回值(即使是void也不可以),在创建对象时候自动执行。------初始化对象的作用。
构造函数必须是public属,否则创建对象时候无法调用。
11、两种创建对象的方式:
在栈上创建对象时候:Student stu("小凯",18.99.9f);
------------这一种实参位于对象名后面。
在堆上创建对象时:
new Student("小凯",19,88.0f);
12、一个类必须有构造函数,要么用户自己定义,要么编译器自动生成。一旦用户定义了构造函数,编译器不再生成。
------------这一种实参位于类名后面。
13、构造函数参数列表
目的是为了书写方便:
Student ::Student(char *name,int age,float score):m_name(name),m_age(age),m_score(score){}
参数初始化表可以用于全部成员变量,也可以只用于部分成员变量。下面的示例只对 m_name 使用参数初始化表,其他成员变量还是一一赋值:
Student::Student(char *name, int age, float score): m_name(name){
m_age = age;
m_score = score;
}
14、参数初始化顺序与初始化表列出的变量的顺序无关,它只与成员变量在类中声明的顺序有关。
15、初始化const成员变量
参数初始化表还有一个很重要的作用,那就是初始化 const 成员变量。初始化 const 成员变量的唯一方法就是使用参数初始化表。----
16、析构函数---在销毁对象时系统会自动调用。~Student(){}
因为析构函数没有参数,所以不能被重载。一个类只有一个析构函数。
全局对象的析构函数在全局数据区,局部对象的析构函数在栈区,如果是new创建的对象,就在堆区。
17、this指针
this是C++中的一个关键字,也是一个const指针,它指向当前对象,通过它可以访问当前对象的所有成员。
this 是 const 指针,它的值是不能被修改的,一切企图修改该指针的操作,如赋值、递增、递减等都是不允许的。
this 只能在成员函数内部使用。
只有当对象被创建后 this 才有意义,因此不能在 static 成员函数中使用(后续会讲到 static 成员)。
this到底是什么???
this实际上是成员函数的一个形参,在调用成员函数时将对象的地址作为实参传递给this。本质上是成员函数的局部变量,所以只能用在成员函数的内部,并且只有在通过对象调用成员函数时才给this赋值。
18、
static静态成员变量------为了实现对象资源共享,A变了,B可以检测到。------该静态数据不算在对象的内存空间里。
static int m_total;在类体内部声明
static成员变量必须初始化(全局数据区都默认0),而且只能在类声明的外部初始化,具体形式为:
int Student:: m_total = 0;
-----静态成员变量在初始化时不能再加static,但是必须要有数据类型。
需要注意的是:static 成员变量的内存既不是在声明类时分配,也不是在创建对象时分配,而是在(类外)初始化时分配。反过来说,没有在类外初始化的 static 成员变量不能使用。
访问:static 成员变量既可以通过对象来访问,也可以通过类来访问。请看下面的例子:
//通过类类访问 static 成员变量
Student::m_total = 10;
//通过对象来访问 static 成员变量
Student stu("小明", 15, 92.5f);
stu.m_total = 20;
//通过对象指针来访问 static 成员变量
Student *pstu = new Student("李华", 16, 96);
pstu -> m_total = 20;
注意:即使是static,也要遵循public和 private、protected 权限。当通过对象名访问是,对于不同的对象,访问的是同一片内存。
static 除了可以声明静态成员变量,还可以声明静态成员函数。普通成员函数可以访问所有成员(包括成员变量和成员函数),静态成员函数只能访问静态成员。
编译器在编译一个普通成员函数时,会隐式地增加一个形参 this,并把当前对象的地址赋值给 this,所以普通成员函数只能在创建对象后通过对象来调用,因为它需要当前对象的地址。而静态成员函数可以通过类来直接调用,编译器不会为它增加形参 this,它不需要当前对象的地址,所以不管有没有创建对象,都可以调用静态成员函数。
19、const关键字
初始化 const 成员变量只有一种方法,就是通过参数初始化表。
与静态函数不同的是,const 成员函数可以使用类中的所有成员变量,但是不能修改它们的值,这种措施主要还是为了保护数据而设置的。const 成员函数也称为常成员函数。
char *getname() const;
char * Student::getname() const{
return m_name;
}
float getscore() const;
注意const的位置。
const也可以用来修饰对象,称为常对象,一旦对象定义为常对象之后,就只能调用类的const成员了。
const class object(params);
class const object(params);
当然,也可是定义const 指针:
const class *p = new class(params);
class const *p = new class(params);
class为类名,object为对象名,params为实参列表,p为指针名。两种方式定义出来的对象都是常对象。
20、与struct不同的是,class中默认属性是private,struct默认属性是public。
21、友元函数
借助友元函数(friend),可以使得其他类中的成员函数以及全局范围内的函数访问当前类的private成员。
我的理解:只有本类的函数才可以访问这个类中的所有权限的数据,但是通过友元函数,可以使得其他类中的成员函数或者全局范围内的函数访问这个类中的private成员。----不同类的函数访问其他类的数据。
friend void Student::show(Address *addr);
----将Student类中的show函数声明为友元函数,意思是show是我的朋友,show函数可以访问我的private数据。