C++入门——类与对象(一)
面向对象与面向过程
面向过程:
C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。
面向对象:
java、c++都是面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。
但是c++也兼容c,所以c++是兼顾面向对象与面向过程的。
类的介绍:
C语言中,结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数。
其实c++中的类就是C语言中的结构体的升级版,其中不仅可以定义变量,还可以定义函数哦。可以用class、struct关键字。
在C++中更喜欢用class来代替
类的使用
class className
{
// 类体:由成员函数和成员变量组成
}; // 一定要注意后面的分号
class Date
{
public:
Date(int year=1900,int mon=1,int day=1)
{
_year = year;
_mon = mon;
_day = day;
}
Date(const Date& d)
{
_year = d._year;
_mon = d._mon;
_day = d._day;
}
private:
int _year;
int _mon;
int _day;
};
为了兼容C语言,所以struct定义的类型默认为public类型,但是class默认类型为private。
为了方便使用尽量还是标明是公共过的还是私有的。
class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号。
类中的元素称为类的成员:类中的数据称为类的属性或者成员变量; 类中的函数称为类的方法或者成员函数。
类的两种定义方式:
- 声明和定义全部放在类体中,需要注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处
理。
比如:
class Date
{
public:
Date(int year=1900,int mon=1,int day=1)
{
_year = year;
_mon = mon;
_day = day;
}
Date(const Date& d)
{
_year = d._year;
_mon = d._mon;
_day = d._day;
}
void print()
{
cout << _year << '-' << _mon << '-' << _day<<endl;
}
private:
int _year;
int _mon;
int _day;
};
print()函数就是写在类内部的函数。
- 声明放在.h文件中,类的定义放在.cpp文件中
谨记:函数如果有缺省值的话尽量写在声明中,然后函数实现就不要再写了。不然会报错哦!
类的访问限定符及封装
访问限定符
C++实现封装的方式:用类将对象的属性与方法结合在一块,让对象更加完善,通过访问权限选择性的将其接口提供给外部的用户使用。
【访问限定符说明】
- public修饰的成员在类外可以直接被访问
- protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)
- 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
- class的默认访问权限为private,struct为public(因为struct要兼容C)
访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别
讲了类,而且c++中的类有类函数就是为了完整性,这种完整性就体现了一种特性——封装。
封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。
封装本质上是一种管理:我们如何管理兵马俑呢?比如如果什么都不管,兵马俑就被随意破坏了。那么我们首先建了一座房子把兵马俑给封装起来。但是我们目的全封装起来,不让别人看。所以我们开放了售票通道,可以买票突破封装在合理的监管机制下进去参观。类也是一样,我们使用类数据和方法都封装到一下。不想给别人看到的,我们使用protected/private把成员封装起来。开放一些共有的成员函数对成员合理的访问。所以封装本质是一种管理。
类的作用域
类定义了一个新的作用域,类的所有成员都在类的作用域中。在类体外定义成员,需要使用 :: 作用域解析符指明成员属于哪个类域。
class Person
{
public:
void PrintPersonInfo();
private:
char _name[20];
char _gender[3];
int _age;
};
// 这里需要指定PrintPersonInfo是属于Person这个类域
void Person::PrintPersonInfo()
{
cout<<_name<<" "_gender<<" "<<_age<<endl;
}
类对象的大小
比如:
这个类对象占了1字节,因为类成员只有char类型的_a,char类型占一个字节,那么类函数存在哪里呢?存放在公共区域(代码段)。
提醒:
空类占多少空间呢?
class A
{
}
占1个字节,因为需要有一个字节的占位符包括虚函数(空函数)也是1字节.
一个类的大小,实际就是该类中”成员变量”之和,当然也要进行内存对齐,注意空类的大小,空类比较特殊,编译器给了空类一个字节来唯一标识这个类。
结构体内存对齐原则在类中也是适用的。