1.1构造函数
class Time
{
public:
Time(); //无参构造函数声明
Time(int a,int b); //有参构造函数声明
}
(1).构造函数在建立对象时自动执行,且只执行一次。
(2).名字与类名相同。
(3).不具有任何类型,不具有返回值。void Time(); 是错误的。
(4).构造函数不被对象调用。t1.Time();是错误的。
(5).如果用户没有定义构造函数,系统会自动生成一个构造函数,但函数体是空的,没有参数,不执行任何初始化操作。
1.2析构函数
class Time
{
public:
Time(); //无参构造函数声明
Time(int a,int b); //有参构造函数声明
……
~Time(); //析构函数声明
}
(1).~是取反运算符。
(2)析构函数是在撤销对象占用的内存之前完成一些清理工作;static局部对象:在main函数结束或调用exit函数结束程序时,调用static局部对象的析构函数;全局对象:
在main函数结束或调用exit函数结束程序时,调用该全局对象的析构函数;new动态建对象:delete运算符释放该对象时,先调用析构函数。
(3).构造函数可有多个,但析构函数只有一个。
(4).构造函数和析构函数的顺序是栈顺序。
1.3对象数组
Student(int = 1001,int = 18,int = 60); //构造函数声明
Student stud[3] = {60, 70, 78}; //定义对象数组
这三个实参分别作为3个对象的实参。所以,在定义数组提供的实参个数不能超过数组元素个数。
1.4对象指针
(1).对象空间的起始地址就是对象的指针。
(2).
class Time
{
public:
Time(int ,int ,int); // 构造函数声明
int hour;
int minute;
int sec;
void get_time();
};
Time t1(10,36,6);
int *p1 = &t1.hour; //定义指向整形数据的指针变量p1,并使p1指向t1.hour。
Time *p2 = &t1; // 定义指向Time类对象的指针变量p2,并使p2指向p1;
void (Time :: *p3) (); //定义指向Time类共用成员函数的指针变量p3
1.5this指针
this指针是指向本类对象的指针,他的值是当前被调用的成员函数或数据成员所在的对象的起始地址。this指针是隐式使用的,他是作为参数被传递给成员函数的。
例:
int Box ::volume() int Box ::volume()
{ {
return (height*width*length); --------------> return ( this->height*this->width*this->length);
} }
1.6共用数据的保护
1.6.1常对象
类名 const 对象名【(实参列表)】 或 const 类名 对象名【(实参列表)】
Time const ti(7 , 8 , 9);
常对象不能调用该对象的非const型成员函数。
1.6.2对象成员
1.6.2.1常数据成员
const 数据类型 变量名;
const int count;
常数据成员只能通过构造函数初始化参数列表,之后不能被再次赋值。
mutable int count;把jcount常数据成员声明为可变数据成员,可修改其值 。
1.6.2.2常成员函数
类型名 函数名() const;
void get_time () const; //const在()后面
数据成员 | 非const成员函数 | const成员函数 |
非const的数据成员 | 可引用,可改变其值 | 可引用,不可改变其值 |
const数据成员 | 可引用,不可改变其值 | 可引用,不可改变其值 |
const对象的数据成员 | 不允许引用和改变其值 | 可引用,不可改变其值 |
1.6.2.3指向对象的常指针
类名 * const 指针变量名 = 对象地址;
指针变量声明为const,指针始终保持其值,不改变。
1.6.2.4指向常对象的指针变量
const 类型名 * 指针变量名;
(1).变量被声明常变量,只能用于指向常变量的指针变量
(2).指向常变量的指针变量也可指向非const变量,此时不能改变指针变量的值。
(3).函数的形参指向非const形变量,实参只能用指向非const变量的指针。
1.7静态成员
在类内声明:
static 类型 变量名;
类外定义:
数据类型 类名::静态数据成员 = 初值;
例:
class Box
{
private :
static int height;
} ; int Box::height = 10;
(1).静态数据成员在内存中只占一份空间,属于这个类的这个类的对象共享静态数据成员的值,但值对所有对象都一样。
(2).静态数据成员不属于对象,对象所分配的空间不包括静态数据成员所占的空间。
(3).静态数据成员的初始化只能在类体外进行初始化。
(4).静态数据成员既可以通过对象名引用,也可通过类名来引用。
(5).静态成员函数跟静态数据成员一样,静态数据成员不能访问本类中的非静态成员。
(6).静态成员函数和静态数据成员先于对象存在。
1.8友元
友元函数不被类所有。
#include <iostream>
using namespace std;
class Time;
class Date
{
private:
int year;
int month;
int day;
public:
Date() { }
Date(int ,int ,int);
void disPlay(Time &);
}; //定义一个Date类,成员函数display,形参是Time类对象
class Time
{
private :
int hour;
int minute;
int second;
public:
friend void disPlay(Time &); //disPlay函数为Time的友元函数
friend void Date::disPlay(Time &); //声明Time类中的disPlay函数为本类的友元函数
Time(int ,int ,int );
Time(){ }
};
Time::Time(int hour,int minute,int second) //Time类的构造函数
{
this->hour = hour;
this->minute = minute;
this->second = second;
}
Date::Date(int year,int month,int day) //Date类的构造函数
{
this->year = year;
this->month = month;
this->day = day;
}
void disPlay(Time &t) //disPlay构造函数的定义
{
cout<<t.hour<<":"<<t.minute<<":"<<t.second<<endl;
}
void Date::disPlay(Time &t) //定义Date类的disPlay方法
{
cout<<year<<"年"<<month<<"月"<<day<<"日"<<endl;
cout<<t.hour<<":"<<t.minute<<":"<<t.second<<endl;
}
int main()
{
Time time(1,2,3);
Date date(1993,8,7);
disPlay(time); //调用
date.disPlay(time);
return 0;
}