一、面向过程和面向对象初步认识
C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。
C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。
举个例子,现在我们需要买一斤卷心菜。 面向过程就是我怎么样去买菜:走出家门,飞到菜市场,挑选卷心菜,给钱,飞回家。 面向对象就是我作为一个对象,我负责前往菜市场、挑选合适的菜,卷心菜作为一个对象,负责处于菜市场的位置,被挑,通过我和卷心菜的交互完成买菜。
二、类的引入
C语言中,结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数。
struct Student
{
void SetStudentInfo(const char* name, const char* gender, int age)
{
strcpy(_name, name);
strcpy(_gender, gender);
_age = age;
}
void PrintStudentInfo()
{
cout<<_name<<" "<<_gender<<" "<<_age<<endl;
}
char _name[20];
char _gender[3];
int _age;
};
//上面结构体的定义,在C++中更喜欢用class来代替
int main()
{
Student s;
s.SetStudentInfo("Peter", "男", 18);
return 0;
}
三、类的定义
class className
{
// 类体:由成员函数和成员变量组成
};
class为定义类的关键字,classname为类名。
{ }中为类的主体,类中的元素称为类的成员:
类中的数据称为类的属性或者成员变量;
类中的函数称为类的方法或者成员函数。
类的两种定义方式:
1.定义时成员函数声明和定义都放在类中。
2.定义时成员函数声明和定义分离,声明放在.h文件中,定义放在.cpp文件中。
四、类的访问限定符及封装
1.访问限定符:
public:公有
private:私有
protected:保护
在类的某个区域加上访问限定符,可以限制对该区域的访问。
比方说,
上图是一个类,
红色部分是私有的,类外部分是没有权限访问红色的。
蓝色部分是共有的,任何人想用就用。
白色部分是受保护的,类外部分也是没有权限访问的。
橙色部分没有进行说明,如果是用class定义的类,默认为私有
2.封装
C++实现封装的方式:用类将对象的属性与方法结合在一块,让对象更加完善,通过访问权限选择性的将其接口提供给外部的用户使用。
当自身的逻辑发生变化时,不会破坏使用方的逻辑,或是强制使用方修改自身的逻辑,而是只需要修改自身的代码就可以了。
五、类的作用域
class Person
{
public:
void PrintPersonInfo();
private:
char _name[20];
char _gender[3];
int _age;
};
void PrintPersonInfo()
{
cout<<_name<<" "_gender<<" "<<_age<<endl;
}
上述代码的两个PrintPersonInfo是同一个函数吗?
还真不是。
在类外定义类的成员,需要再成员前声明其属于的类。
比方说上文的PrintPersonInfo应该加上 “类名::”
六、类的实例化
用类类型创建对象的过程,称为类的实例化
- 类只是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没有分配实际的内存空间来存储它
- 一个类可以实例化出多个对象,实例化出的对象占用实际的物理空间,存储类成员变量
- 做个比方。类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图,只设计出需要什么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间
七、类的对象大小的计算
空类占用一个字节,结构体内存对齐
八、类成员函数的this指针
非静态成员函数实际上的形参个数比程序员写的多一个。多出来的参数就是所谓的“this指针”。这个“this指针”指向了成员函数作用的对象,在成员函数执行的过程中,正是通过“Ihis指针”才能找到对象所在的地址,因而也就能找到对象的所有非静态成员变量的地址。
// 1.下面程序能编译通过吗?
// 2.下面程序会崩溃吗?在哪里崩溃
class A
{
public:
void PrintA()
{
cout<<_a<<endl;
}
void Show()
{
cout<<"Show()"<<endl;
}
private:
int _a;
};
int main()
{
A* p = nullptr;
p->PrintA();
p->Show();
}
程序会正常运行,因为传空指针没有问题,解引用空指针才有问题。
总结
以上就是今天的内容辣。