面向对象程序设计四个主要特点
抽象 封装 多态 继承
1、封装:将数据和操作数据的方法放在一起,对外部隐藏实现细节。,外部无法直接访问和操作数据,只能通过公有的接口方法来访问和操作。
2、继承:一个类可以继承另一个类的属性和方法。并添加自己的操作
3、多态:同一种行为或方法在不同情况下的不同表现形式,继承之后添加的操作不同导致多态
4.抽象:是面向对象编程中的一个重要原则,它将共同的属性和方法抽象出来,形成一个抽象类或接口。
c++类主要特点就是抽象和封装
对象的构成:
静态特征(属性)
动态特征(行为或功能·)
类的声明和对象的定义
类和对象的关系
类是对象的抽象,对象是类的具体实例,可以说类是对象的模板
一般形式:
class 类名{
private:私有数据和对象;
public:公共数据和成员函数:
};
注意:
如果在类中没有指定private:或;public:则默认全部private
private和public,protected
private和public protected被称为成员限定符
被声明private(私有)只能被本类中的成员函数引用访问,类外不可以引用
(友元除外)
public:公共的外界可以调用
proteced:受保护的不能被类外访问,但是可以派生访问
定义类(和结构体类似)
1.先声明用的时候定义
1.class 类名 对象名(c语言风格)
class student st1;
2.类名 对象名(c++语言风格)
student st1;
2.声明时直接定义
class 类名{
private:私有数据和对象;
public:公共数据和成员函数:
};对象名
例如:
class student{
private:
public:
}stu1;
3.声明时无类名直接定义
class {
private:私有数据和对象;
public:公共数据和成员函数:
};对象名
例如:
class {
private:
public:
}stu1;
****常用方法一***
类的成员函数:
在类内定义函数时不用加上类名,因为显而易见属于那个类,定义方式显而易见
类外定义成员函数
函数要在类内声明
一般形式:
返回值类型 类名 ::函数名(){};
::作用限定符
话不多说上例子
class student{
private:int age;
char sex;
public:void print1(); ///类内声明
};
void student:: print1()///类外定义
{
cout<<age<<sex;
}
内置成员函数:
一般形式:
inline 返回值类型 函数名(){};
使用说明:
只有在类外定义的成员函数很小且带哦用频率高设为内置函数才会有好处
如果函数很大就算定义为内置函数,编译器往往会忽略设定将其 认为是一般函数
成员函数的存储:
同一个类不同对象的数据成员值不同但是成员函数代码相同,不论调用那个函数,其实就是调用相同的代码内容,,所以无论设多少个对象,他们只占用一份的公共函数代码
所以一个对象所占有空间大小只会取决于该对象中数据成员所占用的空间
this指针
专门解决不同对象使用同一个公共函数代码,怎么区分对不同对象中的数据进行操作的问题
,当调用st1时 this就会指向st1 this=&st1;(隐式调用)
****成员函数不会占用对象的存储空间
访问对象成员方法
1.‘.’成员 运算符
对象名.成员名
***类内至少有一个公用函数的成员函数,作为对外接口,否则无法·对对象进行任何操作访问
2.通过指针访问成员函数
p->成员
3.通过对象的引用
c++程序组成部分:
1.类声明头文件(后缀 .h)
2.类实现文件(后缀 .cpp)包括类成员函数声明
3.类的使用文件(后缀 .cpp)主文件
类对象的初始化
1.定义类对象进行初始化
2.构造函数初始化
构造函数概念:
c++提供了构造函数来处理对象的初始化,构造函数是一种特殊的成员函数,与其他成员函数不同,不需要用用户调用它,会在建立对象的时侯系统自己调用,自己执行
一般形式|:
构造函数名字必须与类名铜名,而不能任意命名(不具有任何类型和返回值)
class time{
public:
time() //构造函数,hour初值为0
{
hour=0;
}
private:int hour;
}
注意事项:
1.构造函数会在建立对象时就进行调用
2.构造函数没有返回值也没有类型
3.构造函数不需要用户调用,也不能被用户调用执行
***********只会被系统调用且只会调用一次******
4.可以用一个类对象初始化另一个类对象
**********t1=t2;**不会调用t2的构造函数
5.一边拿不提倡在构造函数中加入除了初始化赋值语句之外的语句
6.用户没有定义构造函数时,系统会自动添加上一个构造函数没有参数没有初始化
7.构造函数可以有多个,参数不同,系统调用情况不同
带参数的构造函数
一般形式(构造函数声明):
构造函数名(参数列表){ };
建立对象时定义形式不同调用构造函数不同
一般形式(建立对象):
类名 对象名(实参列表);
参数初始化表对数据成员初始化:
一般形式:
类名::构造体函数名([参数表])[:成员初始化表]
{
[构造体函数]
}
****如果数据成员是数组,则应该在构造函数的函数体中用语句进行赋值,而不能用参数初始化表中进行对其初始化
例如:
student (int age,cahr s,num[]):num(n),sex(s)
{
strcpy(name,nam);
}
对构造函数进行重载
1默认构造函数:在建立时不必给出实参的构造函数*(一个类只有一个默认构造函数)
2.如果用户希望创建变量时就能给数据成员有初值,就必须定义构造函数
3.无参对象没有小括号
student st;student st()错误
4.一个对象只会调用一个构造函数
构造函数默认参数
构造函数中的参数的值既可以通过实参传递也可以指定为某些默认值,如果不指定实参值编译系统默认值设定
注意
1.应当在声明构造函数时指定默认值,而不是只在定义构造函数时指定默认值
2.一个类只能由一个默认构造函数
3.一般不同时使用构造函数的重载和有默认参数的构造函数
析构函数
析构函数是用于在对象被删除之前的清理工作,在对象生命周期即将结束时被自动调用。(析构函数可以清理对象并且释放内存)
析构函数 ~加上类名()
进行操作,目的时清空数据,释放内存。
一般形式:
~加上类名()
析构函数调用时机
(1)全局对象(生命周期:程序运行时创建,程序结束时销毁)的构造函数在所有函数(包括main函数)执行之前调用。
但如果一个程序中有多个文件,而不同的文件中都定义了全局对象,则这些对象的构造函数的执行顺序是不确定的。当main函数执行完毕或调用exit函数时(此时程序终止),调用其析构函数。
(2)局部对象(在函数内定义的对象,其生命周期是进入该函数该语句创建,函数退出结束)
在进入该函数建立对象时调用其构造函数。如果函数被多次调用,则在每次建立对象时都要调用构造函数。在函数调用结束时调用析构函数。
(3)静态(static)局部对象(生命周期是第一次进入该函数创建,程序退出时销毁)
则只在程序第一次调用此函数建立对象时调用一次构造函数,在调用结束时对象并不被释放,因此也不调用析构函数,只在main函数结束或调用exit函数结束程序时,才调用析构函数。
(4)动态创建的对象,是调用new关键字创建函数时调用构造函数,调用delete函数销毁对象时调用析构函数。
const定义常量
1定义常对象:
一般形式:
类名 const 对象名 [(实参表)]
const 类名 对象名 [(实参表)]
注意
1.****定义常对象时必须要对他进行初始化,之后不能改变
2.如果一个对象被定义为常对象,则通过该对象只能调用它的常成员函数,以防普通成员函数修改其值
3.常成员函数只能调用访问常对象的数据成员,但是不能修改其值
定义常对象成员
1.常数据成员
只能通过构造函数的参数初始化表对常数据成员进行初始化,任何其他的函数都不能对常数据成员赋值
注意:
构造函数只能用参数初始化表对常数据成员进行初始化
2.常成员函数
如果一个函数被设为常成员函数那么他只能访问本类的数据成员,不能修改他们
一般形式:
类型名 函数名(参数表)const;
注意:
1.const时函数的一部分,再生命和定义的时候都要有const关键字,调用时不必
2.如果一个类中有些数据是允许被修改的一些是不被允许修改的,则可以将这一部分数据成员修改为const,保证其值不被修改,可以用非const的成员函数引用这些数据成员的值,并修改非const的数据成员的值
总结:
(1)将需要保护的变量声明为const,以保证其值不会被改变。
(2)类中如果所有成元变量都需要保护,可以将所有成员变量都声明为const,本对象的任何成员函数都只能引用不能改变他们。或者将这些成员变量所属的对象声明为const,只让本对象的const成员函数引用,但不能改变。
(3)如果一个对象被定义成立常对象,只能调用类中的const成员函数,不能调用非const成员函数。
(4)常成员函数不能调用非const成员函数,因为这样有可能会修改成员变量的值。
指向对象的常指针
将指向对象的指针变量声明为const型,并使之初始化,这样指针值始终保持为其初始值,不能改变。(始终指向一个同一个对象,但是可以改变指向对象的值)
常指针的一般形式为
类名 * const 指针变量
指向常对象的指针
如果一个变量已经被声明成常变量,则只能用指向常变量的指针变量指向它,而不能用一般的(非const型的)指针变量指向它。(指针可以指向其他值const或非const的变量,但常对象的总不能改变)
常对象的指针的一般形式为
const 类名 * 指针名;
全局变量、局部变量和静态变量
静态变量
变量定义前加上 static
局部变量
定义: 在一个函数内部定义的变量是局部变量,它只在本函数范围内有效。
全局变量
定义:在函数外定义的变量是全局变量,全局变量可以为本文件中其它函数所共用,它的有效范围从定义变量的位置开始到本源文件结束。