《C++ Primer Plus》 学习笔记-第三章


面向对象(OOP)的本质就是设计和扩展自己的数据类型,类实例化对象

C++数据类型

分为基本类型和复合类型。

  • 基本类型:整型和浮点型机器多种变体
  • 复合类型:数组、字符串和指针等

基本类型

  • 首位下划线命名规则:
  • 保护成员函数:保护成员函数的开头应当加上一个下划线“_”以示区别,例如:"_SetState()"
  • 私有成员函数类似地,私有成员函数的开头应当加上两个下划线“__”,例如:"__DestroyImp()"
  • 虚函数习惯以“Do”开头,如:“DoRefresh()”, “_DoEncryption()” …
整型
  • 有符号:short , int , long , long long (至少16,16-32,32,64)
  • 无符号:前缀加unsigned short…
  • 符号常量:#define INT_MAX 32767 cout<<INT_MAX;(P41表3.1) 但是C++有一种更好地创建符号常量的方法, 即const
short sam = SHRT_MAX; sam设置为最大值
unsigned sue = =sam;
sum++;	//超出short最大范围值,所以循环变成-32768
sam++;	//无影响,因为+1仍然比其最大值小得多
  • 如何选择整型
    一般使用int。如果知道变量表示的整数值大于16位整数,则使用long,这样即使移植到16位系统上不会出现无法正常工作的问题。如果超过20亿,则需要long long 。
  • C++如何确定数据类型,例子:
cout<<"This is "<<1000<<endl;

一般情况下,都认为是int型;特殊情况(后缀+长度)
后缀:u,l,ul,ull,ULL (1000ULL)(1000ull)即可表示类型
长度:会选择存储该数的最小类型(int,long,long long)

字符型
  • char类型(采用ASCII字符集)例如A对应编码为65
...
cin>>ch;	//输入A ,cin 将A转换为ASCII码 77
int i = ch ;	//i表示其ASCII码
cout<<ch<<i<<endl;		//cout 将ASCII码77 转换为A显示   (数字也有ASCII码)
  • 通用字符名(表示的是ISO 10646码点(意思和Unicode差不多))
    使用\u 表示8位的十六进制,\U表示16位的十六进制,例如:
int k = \u00F6;	//00F6
cout<<g\U00e2;	//00E2
  • C++11新增加的类型 char16_t和char32_t
bool型
  • bool类型 true false
const限定符
 const type name = value;
 const Month = 12;	//首字母大写,应该在声明时定义
浮点型
  • 表示法:标准小数点表示法(1.245 , 2.0),E方法(1.25E/e16)
  • 后缀表示: 1.2L、2.14F…
  • 格式控制:cout.setf(可选标志)
    cout.setf(ios_base::fixed, ios_base::floatfield)
    C++中通过cout来实现格式输出,就类似于C语言中通过printf()来实现格式输出。cout.setf()的作用是通过设置格式标志来控制输出形式,其中ios_base::fixed表示:用正常的记数方法显示浮点数(与科学计数法相对应);ios_base::floatfield表示小数点后保留6位小数。cout.setf函数.
  • iomanip 头文件的用法
    iomanip
算术运算符
  • 例如:float a = 1.2/4*3在优先级相同的情况下采取从左至右的结合方式
  • 对于int float double 的除法 ,其实是 / 运算符的重载
  • 浮点型*整型 = 浮点型

类型转化

旧式C语言类型转换:
double b = 3.14 
int a = (int)b;     int a = b;//隐式转换 
新式C++类型转换
  • static_cast 静态类型转换
    static_cast<目标类型>(标识符)
    静态:即在编译期内即可决定其类型的转换,用的也是最多的一种。
double b = 3.14;
int a = static_cast<int> b;
  • dynamic_cast 动态类型转换
    dynamic_cast<目标类型>(标识符)
    用于多态中父子类之间的多态转换
#include<iostream>
class Animal {
public:
	virtual void cry() = 0;
};

class Dog : public Animal
{
public:
	virtual void cry()
	{
		std::cout << "旺旺" << std::endl;
	}
	void dohome()
	{
		std::cout << "看家" << std::endl;
	}
};
class Cat : public Animal
{
public:
	virtual void cry()
	{
		std::cout << "喵喵" << std::endl;
	}
	void dohome()
	{
		std::cout << "抓老鼠" << std::endl;
	}
};

int main()
{
	Animal* base = NULL;
	base = new Cat();
	base->cry();
	//⽤用于将⽗父类指针转换成⼦子类,
	Dog	*pDog = dynamic_cast<Dog*>(base); //此时转换时失败的,因为父类指针现在指向的对象是猫,所以转换狗是失败的。
	                                      //转换失败返回空(NULL)
	if (pDog != NULL)
	{
		pDog->cry();
		pDog->dohome();
	}
	Cat* pCat = dynamic_cast<Cat*>(base); //此时转换成功,成功将父类指针转换成子类指针
	if (pCat != NULL)
	{
		pCat->cry();
		pCat->dohome();
	}
	system("pause");
	return 0;
}
  • const_cast 去掉const属性转换
    const_cast<目标类型>(标识符):目标类型只能是指针或者引用
  • reinterpret_cast<目标类型>(标识符)
    数据的二进制重新解释,但是不改变其值。
    C++类型转换

编程习题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值