类和对象的初步认识:
1.类是对象的抽象,而对象是类的具体实例
类是抽象的,不占用内存;而对象是具体的,占用存储空间
2.面向过程与面向对象
C语言是面向过程的,关注的是过程中的数据与方法
C++语言是面向对象的,关注的是对象的属性与功能
类的引入:
在C++中,结构体内不仅可以定义变量,还可以定义函数
struct student
{
public:
char _name[20];
char _gender[10];
int _age;
void setstudentinfo(const char* name,const char* gender,int age)
{
strcmp(_name,name);
strcmp(_gender,gender);
_age = age;
}
};
void test()
{
student s;
s.setstudentinfo("鸟哥","男",20);
cout << "鸟哥姓名:" << s._name << endl;
cout << "鸟哥性别:" << s._gender << endl;
cout << "鸟哥年龄:" << s._age << endl;
}
类的定义:
class classname
{
//类体:由成员函数和成员变量组成
};
class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面带分号。类中的元素称为类的成员,类中的数据称为类的属性或者类的成员变量;类中的函数称为类的方法或者类的成员函数
类的两种定义方式:
1.类的声明和定义全部放在累体中
class person
{
public:
void showinfo()
{
cout << _name << _sex << _age << endl;
}
private:
char* _name;
char* _sex;
int _age;
};
2.类的声明放在 .h 文件中,类的定义放在 .cpp 文件中
//Person.h
class person
{
public:
void showinfo();
private:
char* _name;
char* _sex;
int _age;
};
//Person.cpp
void person::showinfo() //在类体外定义成员,需要使用 :: 作用域解析符指明成员属于哪个类域。
{
cout << _name << _sex << _age << endl;
}
类的访问限定符及封装:
访问限定符:
public(共有);private(私有);protected(保护)
访问限定符说明:
1. public成员在类外可以直接访问;
2. protected和private成员在类外不能够访问
3. 它们的作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
4. class定义的类体中如果没有定义限定符,则默认访问权限是private;struct默认为为public型(因为struct要兼容C)
注意:访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别
封装:
隐藏对象的属性和实现细节,仅对外公开接口和对象进行交互,将数据和操作数据的方法进行有机结合
类的作用域:
类定义了一个新的作用域,类的所有成员都必须在类的作用域中
在类体外定义成员,需要使用 :: 作用域解析符指明成员属于哪个类域
在类的作用域外,只能够通过对象(或指针)借助成员访问操作符.和->来访问类成员
在使用一个变量前,必须先要对变量进行声明,这里需要注意的是,类的成员变量在类中具有全局作用域
类的实例化:
用类类型创建对象的过程,称为类的实例化
1. 类只是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没有分配实际的内存空间来存储它
2. 一个类可以实例化出多个对象,实例化出的对象 占用实际的物理空间 存储 类成员变量
3. 做个比方。类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图,只设计出需要什么东 西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间
代码举例:
//student 是一个已经定义好的学生类
void test()
{
student s; //创建对象
s.setstudentinfo("鸟哥","女",20);cout << "鸟哥姓名:" << s._name << endl;
cout << "鸟哥性别:" << s._gender << endl;
cout << "鸟哥年龄:" << s._age << endl;
}
类的对象大小的计算:
问题: 类中既可以有成员变量,又可以有成员函数,那么一个类的对象中包含了什么?如何计算一个类的大小?
存储方式:
只保存对象的具体成员变量,所有成员函数放在统一的代码公共区
下面通过实例来看看类大小的计算:
//类中既有成员变量,又有成员函数
class A
{
public:
void f1()
{}
void f2()
{}
private:
int _a;
};
//sizeof(A) = 4
//类中只有成员函数
class B
{
public:
void f1()
{}
void f2()
{}
};
//sizeof(B) = 1
//空类
class C
{
};
//sizeof(C) = 1
一个类的大小,实际就是该类中”成员变量”之和,当然也要遵循内存对齐原则,空类比较特殊,编译器给了空类一个字节来唯一标识这个类
类成员函数的 this 指针:
1. 每个成员函数都有一个指针形参,它的名字是固定的,称为this指针,this指针是隐式的
2. 编译器会对成员函数进行处理,在对象调用成员函数时,对象地址作实参传递给成员函数的第一个形参this指 针
3.this指针是成员函数隐含指针形参,是编译器自己处理的,我们不能在成员函数的形参中添加this指针的参数,定义时,也不能在调用时显示传递对象的地址给this指针
上图中绿色部分的 this 是可以显示写出来的。