一.隐形类型转换
系统自动进行,不需要开发人员转化
int m = 3 + 183.6;//把小数部分截掉,属于隐式类型转化
double n = 3 + 183.6;
二.显示类型转换,也称为强制类型转换
C语言的方法:
int m = 5 % (int)3.2;//属于C语言风格的转化
int m = 5 % int(3.2);//等价于上边
C++的方法:
a.static_cast;//静态转换,字面理解就是正常的转换,要注意转换的安全性和正确性,比如不能把字符串类型转化为整形;
//C风格的转换
double f = 100.34f;
int i = (int)f;
//C++风格
int i2 = static_cast<int>(f);//<>里面是要转化成的类型,()里面是要转化的值
//把子类转化成父类的对象
class A {};
class B :public A{};//子类继承父类
B b;
A a = static_cast<A>(b);//把子类转化成父类对象,但是父类不可以转化成子类
b.dynamic_cast;主要用于运行时类型识别和检查,也是父类和子类的相互转换
c.const_cast;只能用来去除指针和引用的const的属性,在编译时进行类型转换。
const int ai = 90;
const int* pai = &ai;
int* pai2 = const_cast<int*>(pai);
*pai2 = 200;//在语法中没错,但是用这种方式改值很不好属于未定义行为(有可能写进去,也有可能没写进去)
d.reinterpret_cast;编译时进行转化类型的检查,重新解释类型。主要用来处理无关类型的转换。(危险的类型转换,功能上很强大)
int i = 10;
int* pi = &i;
int* p2 = reinterpret_cast<int*>(&i);
char* p3 = reinterpret_cast<char*>(pi);
e.void 万能指针与其他指针的转换,void *无指针类型,可以转向任何指针
总结.所有的强制类型转换都不建议使用,会干扰系统的内容检查,会抑制编译器报错。
三.类
1.综述
类是我们自己定义的数据类型(新类型)
设计类要考虑的角度:
要站在设计和实现者的角度来考虑
要站在使用者的角度来考虑
父类子类问题,父类中要放上公共属性。
2.类基础
a.一个类就可以当作用户自己设定的命名空间里面有成员函数和成员变量。
b.类主要由成员函数和成员变量组成。
class student {
public:
int number;
char name[100];
};
int main()
{
student someone;
someone.number = 1000;
//使用指向对象的指针的话,格式如下
student* psomeone = &someone;
psomeone->number = 20000;
cout << someone.number << endl;
.public 成员是暴漏给外界,提供给外界的接口,private成员提供实现各种类方法的细节问题,不爆露给外界,因此外界无法使用。
struct结构,默认是pubic属性,都是公开的,class成员默认是私有的private
a.C语言的初始化成员函数
class Time {
public:
int Hour;
int Minute;
int Second;
};
void inittime(Time& stemptime, int tmphour, int tmpmin, int tmpsec)
{
stemptime.Hour = tmphour;
stemptime.Minute = tmpmin;
stemptime.Second = tmpsec;
}
int main()
{
Time mytime;//类对象,把对象初始化
inittime(mytime, 11, 14, 5);
cout << mytime.Hour << endl;
cout << mytime.Minute << endl;
cout << mytime.Second << endl;
b.C++的写法
class Time {
public:
int Hour;
int Minute;
int Second;
//成员函数
void inittime( int tmphour, int tmpmin, int tmpsec)
{
Hour = tmphour;
Minute = tmpmin;
Second = tmpsec;
}
};
int main()
{
Time mytime;//类对象,把对象初始化
mytime.inittime(11,14,5);
cout << mytime.Hour << endl;
cout << mytime.Minute << endl;
cout << mytime.Second << endl;
.成员函数中可以直接使用成员变量名
头文件
#ifndef __MYTIME__//头文件防卫式声明
#define __MYTIME__
//头文件放定义
class Time {
public:
int Hour;
int Minute;
int Second;
//成员函数
void inittime(int tmphour, int tmpmin, int tmpsec);
};
#endif
源文件
#include"Time .h"
//成员函数的实现
//两个冒号叫做 作用域运算符
void Time::inittime(int tmphour, int tmpmin, int tmpsec)
{
Hour = tmphour;
Minute = tmpmin;
Second = tmpsec;
}
c.对象的拷贝
int main()
{
Time mytime;//类对象,把对象初始化
//对象的拷贝
mytime.Hour = 10;
mytime.Minute = 14;
mytime.Second = 30;
//这四种方式都可以初始化
//对象本身都是可以拷贝的,下边的四种方式都是可以拷贝的
//而且是每一个成员变量逐个拷贝
Time mytime2 = mytime;
Time mytime3(mytime);
Time mytime4{ mytime };
Time mytime5 = { mytime };
mytime5.Hour = 8;
.d 私有成员
外部无法调用,但是可以被内部的成员函数调用