一,对象的动态建立与释放
new (程序员怎么会没有朋友??? 来让我给你new 一个)
在我学过的c中 我们一般都用 malloc 来动态申请空间。现在我们可以用new 来申请空间
Box *pt;
pt = new Box;
c++允许在new时进行赋值
Box *pt = new Box(12, 13, 5);
在我们不需要使用new建立的对象时 我们可以通过delete 运算符释放
delete pt;
二,对象的赋值
类的成员中不能包括动态分配的数据。
一般形式 对象名1 = 对象名2
Student stu1,stu2;
stu2 = stu1;
Box box1(1, 2, 3), box2;
box2 = box1;
三,对象的复制
形式: 类名 对象2(对象1)
Box box2(box1);
Box box2 = box1;
在对象的复制中,原理是在建立对象时调用一个特殊的构造函数——复制构造函数
Box::Box(const Box&b){
height = b.height;
width = b,width;
length = b.length;
}
形式上:
类名(形参列表); //普通构造函数的声明,如Box(int h, int w, int l);
类名(类名 &对象名); //复制构造函数的声明,如Box(Box &b);
四,静态成员
如果有n个同类的对象,那么每一个对象都分别有自己的数据成员,不同对象的数据成员各有各值,互不相干,但是有时人们希望有某一个或几个数据成员为所有对象共有。这样可以实现数据共享。
静态数据成员就是多个对象共享的数据成员,给大家举个栗子,
有几个相邻的学校,各个学校分别有自己的教学楼,实验室,办公楼,宿舍,食堂,图书馆,为了节约开支,共有资源,这几个学校共建礼堂和运动场。每个学校都可以认为本校既有教学楼,实验室,办公楼,宿舍,食堂,图书馆又有礼堂和运动场。但是如果改变礼堂和运动场的大小与功能,就会影响所有的学校。
(1)静态数据成员
class Box{
public:
int volume();
private:
static int height;//静态数据成员
int width;
int length;
};
静态数据成员只能在类体外进行初始化
int Box::height = 10;
一般形式为
数据类型 类名::静态数据成员名 = 初值;
(2)静态成员函数
static int volume();
静态成员函数是类的一部分而不是对象的一部分,如果在类外调用公用的静态成员函数,是要用类名和域运算符 “ ::”
Box::volume();
静态成员函数主要用来访问静态数据成员,而不访问非静态数据成员。
非静态成员函数都可以访问
五,友元
在一个类中可以有共有(public)成员和私有(private)成员,我们把客厅比喻成公用部分,用卧室比喻私有部分。类外可以访问公用成员,只有在本类中的函数可以访问本类的私有成员。现在我们来打破这个常规 来一个例外 (friend)
friend 的意思是朋友,卧室本来只能够自己的家人进,客厅对外来所有客人开放,而你允许好朋友进入你的卧室。
你在类外定义了一个函数,然后在类体中声明为友元,此函数就是这个类的友元函数
友元函数可以访问这个类中的私有成员。
友元函数
#include<iostream>
using namespace std;
class Time{
public :
Time(int, int, int);
friend void display(Time &);
private :
int hour;
int minute;
int sec;
static int day;
};
int Time::day = 30;
Time::Time(int h, int m, int s){
hour = h;
minute = m;
sec = s;
}
void display(Time &t){
cout << t.hour << ": " << t.minute << ": " << t.sec << endl;
}
int main (){
Time t1(1, 3, 3);
display(t1);
return 0;
}
友元成员函数
friend 函数不仅可以是一般函数(非成员函数),而且可以是另一个类中的成员函数
#include<iostream>
using namespace std;
class Date; //对Date类的提前引用声明
class Time{
public :
Time(int, int, int);
void display(Date &);
private :
int hour;
int minute;
int sec;
};
class Date{
public:
Date(int , int, int);
friend void Time::display(Date &);
private :
int month;
int day;
int year;
};
Time::Time(int h, int m, int s){
hour = h;
minute = m;
sec = s;
}
void Time::display(Date &d){
cout << d.year << ": " << d.month << ": " << d.day << endl;
}
Date::Date(int y, int m, int d){
year = y;
month = m;
day = d;
}
int main (){
Time t1(1, 3, 3);
Date d1(2018, 12, 22);
t1.display(d1);
return 0;
}
一个函数可以被多个类声明为(friend),这样就可以引用多个类中的私有数据
友元类
不仅仅可以将一个函数声明为一个类的“朋友”,而且可以将一个类(例如类B)声明为另一个类(例如类A)的“朋友”。这时类B就是A的友元类,友元类B中的所有函数都是类A的友元函数,可以访问A中的所有成员,就像一个家庭,不仅允许一个好朋友进入他人的家庭,还允许朋友的全家人进入他家的卧室。
class B{
};
friend B;
(1)友元的关系是单向的。
(2)友元的关系不能传递,B是A的友元,C是B的友元,但是C不是A的友元。