第17章:特殊类成员
来源:互联网 发布:优化驱动器要不要开 编辑:程序博客网 时间:2024/04/29 20:44
1:静态成员变量:用关键字static 来声明静态成员变量 属于类的成员,并不属于对象成员,需要在类外给它分配内存
class A
{
public:
A(int num):it(num){total++;}
~A(){total--;}
static int total;
private:
int it;
};
int A::total = 0;在类外给静态成员变量分配内存
2:静态成员变量并不属于类中的对象,它属于整个类,需要用类来访问静态成员变量,
因此在创建类的对象的时候并不会给类的静态成员变量分配内存,所以在类外给静态成员变量分配内存,
3:静态成员在没有对象的时候就已经存在
4:私有静态成员函数,声明后在全局进行定义,只能通过公有的成员函数访问,这时就需要创建一个类的对象
5:静态成员函数和静态成员变量一样属于类的成员,它不能访问类的普通成员变量,因为它没有专属于某个对象this指针
6:可以通过对象来访问静态成员函数,尽量使用类成员名限定来访问静态成员
7:静态成员可以被继承,基类和派生类都可以共享静态成员
8:类中的任何函数都可以访问静态成员,但是静态成员函数只能访问静态成员不能访问非静态成员
9:静态成员函数不能被说明成虚函数
10:函数指针:我们知道数组名是指向数组第一个元素的常量指针,同理,函数指针是指向函数第一条指令的常量地址
int (*fun)(int);函数指针fun指向返回值为int带一个int参数
11:函数指针数组:
void (*p[5])(int&,int&);声明了一个含有5个元素的数组指针
12:函数指针也可以作为函数的参数
13:利用关键字typedef来简化函数指针的声明
typedef void (p*)(float&,float&y);
typedef将void (*)(float&,float&y)简化成了p
14:类的成员函数指针
1:成员函数指针的声明
void (A::*p)(int,int)
class A
{
public:
void set(int x,int y)
{
a = x;
b = y;
}
void show()
{
cout<<a<<b<<endl;
}
private:
int a;
int b;
};
int main()
{
A a;
p = &A::set;//&A::set取类A的函数set的地址
int x = 2,y = 3;
(a.*p)(x,y);必须加*号不然访问的是函数的地址而不是函数名
//第二种表示的方法
A *a = new A;
(a->*p)(x,y);
表示的是a->获得指针指向的对象
p指向的是函数的地址*p获得函数名
}
class Human
{
virtual void run() = 0;
virtual void eat() = 0;
};
class Mother:public Human
{
public:
void run(){cout<<"mother run"<<endl;}
void eat(){cout<<"mother eat"<<endl;}
};
class father:public Human
{
public:
void run(){cout<<"father run"<<endl;}
void eat(){cout<<"father eat"<<endl;}
};
class uncle:public Human
{
public:
void run(){cout<<"uncle run"<<endl;}
void eat(){cout<<"uncle eat"<<endl;}
};
int mian()
{
void (Human::*pf)()=0;定义的类的成员函数指针指向的成员函数是一个纯虚函数
}
class A
{
public:
A(int num):it(num){total++;}
~A(){total--;}
static int total;
private:
int it;
};
int A::total = 0;在类外给静态成员变量分配内存
2:静态成员变量并不属于类中的对象,它属于整个类,需要用类来访问静态成员变量,
因此在创建类的对象的时候并不会给类的静态成员变量分配内存,所以在类外给静态成员变量分配内存,
3:静态成员在没有对象的时候就已经存在
4:私有静态成员函数,声明后在全局进行定义,只能通过公有的成员函数访问,这时就需要创建一个类的对象
5:静态成员函数和静态成员变量一样属于类的成员,它不能访问类的普通成员变量,因为它没有专属于某个对象this指针
6:可以通过对象来访问静态成员函数,尽量使用类成员名限定来访问静态成员
7:静态成员可以被继承,基类和派生类都可以共享静态成员
8:类中的任何函数都可以访问静态成员,但是静态成员函数只能访问静态成员不能访问非静态成员
9:静态成员函数不能被说明成虚函数
10:函数指针:我们知道数组名是指向数组第一个元素的常量指针,同理,函数指针是指向函数第一条指令的常量地址
int (*fun)(int);函数指针fun指向返回值为int带一个int参数
11:函数指针数组:
void (*p[5])(int&,int&);声明了一个含有5个元素的数组指针
12:函数指针也可以作为函数的参数
13:利用关键字typedef来简化函数指针的声明
typedef void (p*)(float&,float&y);
typedef将void (*)(float&,float&y)简化成了p
14:类的成员函数指针
1:成员函数指针的声明
void (A::*p)(int,int)
class A
{
public:
void set(int x,int y)
{
a = x;
b = y;
}
void show()
{
cout<<a<<b<<endl;
}
private:
int a;
int b;
};
int main()
{
A a;
p = &A::set;//&A::set取类A的函数set的地址
int x = 2,y = 3;
(a.*p)(x,y);必须加*号不然访问的是函数的地址而不是函数名
//第二种表示的方法
A *a = new A;
(a->*p)(x,y);
表示的是a->获得指针指向的对象
p指向的是函数的地址*p获得函数名
}
class Human
{
virtual void run() = 0;
virtual void eat() = 0;
};
class Mother:public Human
{
public:
void run(){cout<<"mother run"<<endl;}
void eat(){cout<<"mother eat"<<endl;}
};
class father:public Human
{
public:
void run(){cout<<"father run"<<endl;}
void eat(){cout<<"father eat"<<endl;}
};
class uncle:public Human
{
public:
void run(){cout<<"uncle run"<<endl;}
void eat(){cout<<"uncle eat"<<endl;}
};
int mian()
{
void (Human::*pf)()=0;定义的类的成员函数指针指向的成员函数是一个纯虚函数
}
0 0
- 第17章:特殊类成员
- 第17章 特殊成员函数
- C++标准ISO-IEC-14882-2003:第12章:类的特殊成员函数-第1节:构造函数
- C++标准ISO-IEC-14882-2003:第12章:类的特殊成员函数-第2节:临时对象
- C++标准ISO-IEC-14882-2003:第12章:类的特殊成员函数-第3节:类型转换
- C++标准ISO-IEC-14882-2003:第12章:类的特殊成员函数-第4节:析构函数
- C++标准ISO-IEC-14882-2003:第12章:类的特殊成员函数-第5节:自由存储管理
- C++标准ISO-IEC-14882-2003:第12章:类的特殊成员函数-第6节:初始化
- C++标准ISO-IEC-14882-2003:第12章:类的特殊成员函数-第8节:拷贝对象
- 类的特殊成员
- 第一篇:.net特殊成员:string
- 类的特殊数据成员
- Python类的特殊成员
- 类的特殊成员方法
- C++标准ISO-IEC-14882-2003:第12章:类的特殊成员函数-第7节:构造与析构
- 类中特殊成员变量的初始化
- as类成员变量的特殊用法
- C++类的特殊数据成员
- [第1章]数据:CoreData的简单使用
- 黑马程序员--String 和基本数据包装类
- Zookeeper 学习笔记(一)
- Collapsing margins(外边距合并)
- 64位windows系统 int类型内存大小和课本中的差异
- 第17章:特殊类成员
- 多校第二场1006
- 大数据运营-服务型企业架构新思维
- 基于HT for Web矢量实现3D叶轮旋转
- 病毒侵袭
- [阿里笔试]对于192.168.0.0到192.168.0.255这个网络来说,以下说法中正确的是____。
- Oracle执行计划详解
- merge into
- 使用Thrift RPC编写程序