类的定义
class classname
{
private:
data;
function();
public:
data;
function();//可以将成员函数的定义直接写在类中,作为内联函数(1-5行,简单)
protected:
data;
function();
};
三种访问权限
public:可以被任意实体访问
protected:只允许子类及本类的成员函数访问
private:只允许本类的成员函数访问
class默认的权限是private
项目类的实现
通常将类的定义写在一个.h文件中,成员函数的定义写在一个程序文件.cpp中,将接口与实现分离
myapp.h,在头文件中定义类
#ifndef MYAPP_H_INCLUDED
#define MYAPP_H_INCLUDED
class Record
{
private: //private成员
char bookname[20]; //数据成员bookname,用于表示图书的名称
int number; //数据成员number,表示图书编号
public: //public成员(构造和析构函数?)
void regist(char *a,int b); //成员函数regist,用于给各数据成员赋值
void show(); //成员函数show,显示各数据成员的值
};
#endif // MYAPP_H_INCLUDED
在myapp.cpp中实现定义的函数
#include<iostream>
using namespace std;
#include "myapp.h"
void Record::regist(char *a,int b)
{
strcpy(bookname,a);
number=b;
}
void Record::show()
{
cout<<"name is "<<bookname<<endl;
cout<<"number is "<<number<<endl;
}
类的使用main.cpp
#include <cstdlib>
#include <iostream>
#include "myapp.h"
using namespace std;
int main(int argc, char *argv[])
{
char a[]="hello";
Record app;
app.regist(a,123);
Record *point;
point=&app;
//访问对象成员的三种方法
app.show();
point->show();
(*point).show();
//可以对对象进行赋值
Record app2;
app2=app;
app2.show();
system("PAUSE");
return EXIT_SUCCESS;
}
输出:
name is hello
number is 123
name is hello
number is 123
name is hello
number is 123
构造函数与析构函数
构造函数(constructor)是与类名同名的特殊的成员函数,当定义该类的对象时,构造函数将被自动调用以实现对该对象的初始化。构造函数不能有返回值,因而不能指定包括void在内的任何返回值类型。构造函数的定义体可与其它成员函数成员一样,放在类内或类外都可。构造函数的定义格式为:
类名(形参说明)
{ 函数体 }
当一个对象被定义时,系统自动调用构造函数为该对象分配相应的资源,当对象使用完毕后,这些系统资源需要在对象消失前被释放。析构函数是类的一个特殊成员函数,其函数名称是在类名的前面加上~,它没有返回值,没有参数,不能随意调用,也没有重载,只是在类对象生命期结束时,系统自动调用。析构函数的定义方式为:
~类名()
{ 函数体 }
对象被析构的顺序与创建的顺序刚好相反,最后构造的对象最先被析构
C++类构造函数初始化列表:http://www.cnblogs.com/BlueTzar/articles/1223169.html
参数列表初始化:classname():对象成员1(参数表1),对象成员2(参数表2),......,对象成员n(参数表n)
1. 如果类中有一个成员是一个引用, 由于引用必须给予初始值, 因此, 引用必须使用初始化列表.
2. 同理, const属性必须给予初始值, 必须使用初始化列表.
3. 继承类中调用基类初始化构造函数, 实际上就是先构造基类对象, 必须使用初始化列表.
class CExample {
public:
int a;
float b;
//构造函数初始化列表
CExample(): a(0),b(8.8)
{}
//构造函数内部赋值
CExample()
{
a=0;
b=8.8;
}
};
拷贝构造函数
拷贝构造函数是C++中引入的一种新的构造函数。定义一个拷贝构造函数的方式是:
类名::类名( const 类名 &形式参数)
{ 函数体 }
由此可看出:
(1)拷贝构造函数的名称与类的名称相同,且它只有一个参数,该参数就是对该类对象的引用。
(2)拷贝构造函数的功能是用于实现对象值的拷贝,通过将一个同类对象的值拷贝给一个新对象,来完成对新对象的初始化,即用一个对象去构造另外一个对象
如果程序员没有为所设计的类提供显式的拷贝构造函数,则系统会自动提供一个默认的拷贝构造函数,其功能是:把作为参数的对象的数据成员逐个拷贝到目标变量中,这称为成员级复制(或浅拷贝)
当函数的参数形参是一个类的对象,传给这个函数的时候就会自动调用这个类的拷贝构造函数。
如果函数的返回值是类的对象,函数执行完后返回会自动调用拷贝构造函数
浅拷贝与深拷贝
默认的拷贝构造函数将已有数据对象的成员一一赋值给同类的新对象的数据成员,这是浅拷贝,成员级拷贝。如果有指针,则仅仅是拷贝了指针指向的地址,两个对象的指针数据指向了同一个地址,可能会造成资源管理的混乱。
要有选择,有变化的复制对象,需要自己编写拷贝构造函数进行深拷贝。
继承
就是在一个已经存在的类的基础上创建一个新类,利用已有数据类型定义出新的数据类型,减少了代码冗余度提高了代码重用性。新类继承了原有类,原有类派生了新类。
被继承的类叫做基类(Base class),通过继承关系定义出来的新类被称为派生类或子类(Derived class)
一个派生类可以从多个基类派生或一个基类派生,叫做多重继承或者单继承
派生类不仅拥有属于自己的数据成员与成员函数,还保持了从基类继承来的数据成员与成员函数;同时派生类可对一些继承来的函数重新定义,以适应新的要求
class 派生类名:继承方式 基类名
{ 派生类中的新成员 }
三种继承方式
public 继承
protect 继承
private 继承
组合结果
基类中 继承方式 子类中
public & public继承 => public
public & protected继承 => protected
public & private继承 = > private
protected & public继承 => protected
protected & protected继承 => protected
protected & private继承 = > private
private & public继承 => 子类无权访问
private & protected继承 => 子类无权访问
private & private继承 = > 子类无权访问
private继承阻止了继承的继续进行。