类:
在面向对象程序设计中,程序模块由类构成。
类是对逻辑上相关的函数与数据的封装,是问题的抽象描述
多态:一段程序能够处理多种类型的能力,通过强制多态,重载多态、包含多态、类型参数化多态4种形式实现。
强制多态:数据类型转换;
封装:将抽象得到的数据和行为结合形成一个整体,即封装成类的数据和成员函数
抽象:对具体问题进行概况,抽象出公共性质并且加以描述的过程,包含数据抽象和行为抽象
概念:
(1)内联函数:直接在声明的时候定义-适用于经常使用且代码较短的函数。
在类体内声明,在类外定义,且使用inline关键字
(2)成员函数:声明在类体,实现在类外,成员函数内调用数据成员无需使用.
定义的时候记得加上 类名::
(3)构造函数:用于对数据对象进行初始化,隐式构造函数初始化所有为空。
当存在没有默认构造函数的内嵌对象(内嵌类)、引用类型数据成员时,必须进行显示构造
(4)复制构造函数:传递一个对象的引用,并且使用它复制一个新对象。有显示和隐含之分
隐含的功能是浅拷贝
(5)析构函数:在对象生命周期结束自动调用。希望程序在对象被删除前的时刻自动完成的行为可以放在析构函数里。
示例如下:
#pragma once
class SalesItem
{
public:
SalesItem(int sa, int d,int c);//显示构造函数
SalesItem();//隐式构造函数
~SalesItem();
void showItem();//普通成员函数
SalesItem(SalesItem &item);//复制构造函数
void neilian(int a)//隐式声明的内联函数
{
cout << a << endl;
}
void neilian2(int a);//显示声明的内联函数
private:
int csdn;
int saled;
float price;
};
SalesItem::SalesItem(int sa,int d,int c)//显示构造函数
{
saled = sa;
csdn = d;
price = c;
}
SalesItem::SalesItem()//默认构造函数
{
}
SalesItem::~SalesItem()//析构函数
{
}
void SalesItem::showItem() {//普通成员函数
cout << saled << price << endl;
}
inline void SalesItem::neilian2(int a){
cout << a << endl;//显示声明的内联函数
}
SalesItem::SalesItem(SalesItem &item) {//复制构造函数
saled = item.saled;
price = item.price;
csdn = item.csdn;
}
复制构造函数的调用:
1)用类的一个对象初始化另一个对象的时候
2)函数形式参数是类的对象,调用该函数时,复制构造函数被调用
3)函数返回值是类的对象
(2)
void f(Point p){
cout<<p.getX()<<endl;
}
int main(){
Point a(1,2);
f(a);
return 0;
}
(3)
Point g() {
Point a(1 , 2);
return a;
}
int main(){
Point b;
b = g();
return 0;
}
类关系
1)依赖关系:一个类使用另一个类作为它的成员函数参数时--如类之间的调用、友元、实例化
2)关联关系:相互作用的连接,几重性
3)包含关系
--聚合:整体与部分,包含、组成、分为..部分,如一个课程有多个学生,但学生可以参加多个课程,课程取消学生还能参加其他课程
--组合:部分与整体共存,整体没了部分也会消失,如一个人有手,人没了手也不存在了
4)继承关系:泛化
结构体
结构体和类的区别:结构体和类拥有不同的默认访问控制属性,类中,未指定访问属性的成员默认为private,结构体默认为public
构造函数的类型转换:只允许显式类型转换时,在构造函数前加上explicit关键字
C++中显示类型转换
1) static_cast:最常用的类型转换,提供基本数据类型之间的转换操作。
2) const_cast:可以把 const 类型的指针转换为非 const 类型的指针。
3) reinterpret_cast:解释的意思,主要用于不相关类型之间的转换。目标和原始值之 间至少有相同的位数,我们可以将转换之后的值再转换回去,而不像其它 3 种类型 可能会导致精度丢失
4) dynamic_cast:运行时检查该转换是否类型安全,但只有在多态类型时合法,主要 用于类层次间的上行和下行转换,还可以用于类之间的交叉转换。在进行类层次间 的上行转换时和 static_cast 效果一样,进行下行转换时,具有类型检查的功能,比 static_cast 更安全。
作用域
- 类作用域: 在类的作用域内,类的成员可以被类的所有成员函数直接访问,在类的作用域之外, public 类成员通过对象的句柄之一而引用。句柄可以是对象名称,对象的引用,对象的指针。 对象,引用或指针指定了客户可访问的接口。
- 全局名字空间作用域:namespace 声明于任何函数或者类之外的标识符具有全局名字空间作用域,这种标识符对于从其声明处开始直到文件结尾处为止出现的所有函数都是已知的,即可访问的。位于函数之外的全局变量。函数定义和函数原型都属于该作用域。
- 函数作用域: 标签是唯一具有函数作用域的标识符,标签可以在函数中的任何地方使用,但是不能在 函数体外被引用。
- 局部作用域: 在一个语句块中声明的作用域,开始于标识符的声明出,结束于标识符声明处所在语句块的结束右花括号处。局部变量具有局部作用域,函数形参也是函数的局部作用域。当语块是嵌套的,并且外层语句块的一个标识符和内层语句块的一个标识符具有相同的名字时, 外层的标识符处于隐藏状态,直到内存的语句块执行结束为止。
- 函数原型作用域: 函数原型形参列表中的标识符,在一个函数原型中,一个特定的标识符只能使用一次
作用域可见性:
- 标识符要先声明后引用
- 同一作用域不能声明同名标识符
- 没有包含关系的作用域声明同名标识符互不影响
- 包含关系的作用域声明同名标识符,外层被隐藏