面向对象(OOP)思想3

1.再谈构造函数
在我前面写的博客面向对象(OOP)思想2中,我介绍了基本构造函数的使用
但是值得注意的是前面所使用的构造函数实际上并不是对对象进行初始化,而是简单的赋值
Date(int year,int month,int day)
{
_year=year;//赋值操作
_month=month;
_day=day;
}
事实上,C++有对对象的初始化语法,话不多说,先上代码
Date(int year,int month,int day)
:_year(year),
_month(month),
_day(day)
{}
这样,就完成了对类成员变量的初始化
注意事项
1.每个成员只能初始化一次
2.类中包含const,引用,自定义类型成员(该雷没有默认构造)
事实上这里有一个坑,请看一下代码
class Date
{
public:
Date(int c)
:
_c©,
_b(2*_c),
_a(2*_b)
{
}
private:
int _a;
int _b;
int _c;
};
如果这样进行初始化,我们调用打印函数去打印_a,_b,_c的值的时候会发现:
_a和_b打印的实际上是随机值
为什么呢?
因为成员的声明顺序就说初始化顺序
和初始化列表中的顺序无关
比如这里事实上编译器是先初始化_a的,然后_b是个随机值,从而造成这种尴尬的场面
class Date
{
public:
Date(int c)
:
_a©,
_b(2*_a),
_c(2*_b)
{
}
private:
int _a;
int _b;
int _c;
};
这样写就可以
2.static成员
定义: 声明为static的类成员成为静态成员,用static修饰的成员变量,称为静态成员变量,用static修饰的成员函数,称为静态成员函数,静态成员变量一定要在类外进行初始化
特征:
1.静态成员为所有类对象所共享,不属于某个实例
比如
class A{
public
static int _a;
};
int A::_a=0;
A a;
A b;
a._a++;
b._a++;
那么_a的值将是2
2.静态成员必须在类外进行定义,定义时候不加static关键字
3.静态成员都可以用类名::静态成员或者对象.静态成员进行访问
4.静态成员函数没有隐藏的this指针,不能访问任何非静态成员
5.静态成员和普通成员一样,也可以用public,private,protected来进行修饰管理,也可以具有返回值
3.友元
1.友元函数
友元函数是定义在类外部的普通函数,它可以访问类中的所有成员,包括private和public以及protected,不属于任何类,定义时候必须要friend关键字来进行修饰
注意事项
1.友元函数可以访问类的所有成员
2.友元函数不可用const修饰
3.友元函数可以定义在任何地方,不受类的访问限定符限定
4.友元函数的调用方式和普通函数无区别
2.友元类
友元类的可以访问类中的所有成员
使用方法和友元函数类似
friend关键子+ class+类名称即可
有个大前提是有员类必须先进行声明,必须存在
注意事项:
1.友元类可以访问类的所有成员
2.友元类具有单向性,事实上可以理解为单相思,及友元类可以访问类的所有成员二类不能访问友元类的私有和保护成员
3.友元关系不可以传递
比如A是B的友元B是C的友元
但是A并不是C的友元
事实上这很显示,你兄弟的兄弟不一定是你的兄弟
4.内部类
如果一个类的内部还有类,那么这个内部的类就叫做内部类
需要注意的是内部类是一个独立的类,它绝对不属于任何一个类的子类
外部类没有方位内部类成员的权限
事实上内部类是外部类的一个友元类
它可以访问外部类的所有成员
甚至可以直接访问外部类的static成员,枚举成员
3.sizeof(外部类)和内部类没有什么关系

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值