<C++ Primer >学习笔记 第二章 变量和基本类型 (下)

本文是《C++ Primer》第二章的学习笔记,深入探讨const限定符的使用,包括const对象、const引用、const指针以及const在指针中的应用。此外,文章还介绍了自定义数据结构的基础,如如何定义和使用struct,以及编写和使用头文件的注意事项。
摘要由CSDN通过智能技术生成

写在前面

第二章写了两部分,主要原因是const和自定义数据结构这块概念很复杂,有点难懂,尤其是书中的自定义数据结构这块跟第七章类紧密挂钩,所以想写的更仔细点。

const 限定符

const的对象创建后值就不会再发生改变,并且const对象必须初始化,初始值可以是任意复杂表达式。参与的操作是不能改变对象内容的。用const定义了一个变量之后,编译过程中会把该变量出现的所有地方都换成这个值,如果不添加extern关键字,默认为const变量只在单独文件中编译。

const的引用
对常量的引用(常量引用),不能改变常量对象的值,只有定义成常量引用才能去引用常量,之前也提到过引用类型必须与其所引用类型一致。比如:

double i=100;
const int &a=i;

const int没办法去引用一个double类型的变量

概念辨析
一个常量引用可以去引用一个同类型的非常量变量,一个普通的引用不能去引用常量变量。意思就是说 const int&可以去引用int变量,一个int& 不能去引用一个const int变量。

const int i=100;
int j=100;
int &a=i;//错误,非常量引用不能引用一个常量对象
const int &b=i;//正确
const int &b=j;//正确

指针和const
常量指针:把指针定义成一个常量值,必须初始化,并且初始化完成之后指针就不在改变了,也就是存放在指针中的那个地址。不变的是指针本身而不是指针指向的那个值。指针和引用类似的是指针指向的内容与指针类似,同时允许一个常量指针指向一个非常量对象

int *p;
*const int q;
int a=100;
const int b=100;
q=&a;//正确,但是不能通过q改变a的值
p=&b;//错误

辨析const int 与int const
没有什么区别,一样的

辨析const int与const int
完全不同,一个是指针不发生改变是个常量(int * const),另一个是指针指向的内容不发生改变(int const * )。主要是看*的位置,在底层const和顶层const中会详细说明。

顶层const和底层const
顶层const:任意的对象,比如指针本身是个常量
底层conse:指针或引用所指的对象是个常量
指针既可以是顶层的也可以是底层的。

constexpr和常量表达式
常量表达式:在编译过程中就可以得到结果的表达式。
在运行过程中得到结果的不是常量表达式。

constexpr:用来声明变量,以便编译器验证变量是否为一个常量表达式。声明为constexpr变量一定是一个常量,必须用常量表达式去初始化。
一个constexpr指针的初始化必须是nullptr或者0,或者存在某个固定地址的对象中,并且constexpr仅对指针有效,与指针所指的对象无关。

处理类型
类型别名(typedef):某种类型的同义词
别名声明(using):来定义类型的别名

auto类型说明符
auto说明符让编译器通过初始值来帮我们推算变量类型,因此auto必须有初始值。auto会忽略掉顶层const,因此需要顶层变量时用const auto。

decltype类型指示符
想要从表达式中推断类型,但是不想用表达式的值初始化变量 。与auto有一点不同如果decltype使用的表达式是一个变量,则返回该变量的类型,包括顶层和引用。并且如果decltype的表达式加上双重括号,那么类型永远都是引用。
decltype((i)) //结果一定是一个引用
declitype(i) //只有i是一个引用时才是引用

自定义数据结构

定义一个Sales_data类型

struct Sales_data{
   std::string bookNo;
   unsigned units_soled = 0;
   double revenue =0.0;
};   //分号不能少

类是以struct开始,紧跟类名和类体,类体结束必须要写一个分号,一般不要把对象的定义和类的定义放在一起。在类体中我们定义类的成员,上面写的类只有数据成员,数据成员的定义和普通变量的定义一致,我们可以为类内的成员添加一个初始值。

2.41 重写Sales_data,输入书本的ISBN,销售量和零售价,输出ISBN,总销售量总销售额和平均售价(没有使用头文件)

#include<string>
#include<iostream>
 
struct Sales_data{
   std::string bookNo;
   unsigned units_soled = 0;
   double revenue =0.0;
};

int main(){
	Sales_data data1,data2;
	double price = 0;
	//读入第一条数据 
	std::cin>>data1.bookNo>>data1.units_soled>>price;
	data1.revenue=data1.units_soled*price;
	//读入第二条数据 
	std::cin>>data2.bookNo>>data2.units_soled>>price;
	data2.revenue=data2.units_soled*price;
	
	if(data1.bookNo==data2.bookNo){
		unsigned totalCnt=data1.units_soled+data2.units_soled;
		double totalRevenue=data1.revenue+data2.revenue;
		//输出 ISBN 总销售量 总销售额 平均价格
		std::cout<<data1.bookNo<<" "<<totalCnt
		         <<" "<<totalRevenue<<" ";
		if(totalCnt!=0) 
		std::cout<<totalRevenue/totalCnt<<std::endl;
		else
		std::cout<<"no sales"<<std::endl;
		return 0;
	} 
	else{
		std::cerr<<"Data must refer to the same ISBN"<<std::endl;
		return -1;
	}
} 

编写自己的头文件
类通常被定义在头文件中,并且头文件名一般与类名保持一致。为了确保头文件能正常工作,常用到一些预处理命令。
#incloud :用指定文件的内容代替#incloud
头文件保护符
#define 把名字设定为预处理变量
#ifdef 当且仅当变量已定义时为真
#ifndef 当且仅当变量未定义时为真
#endif 当变量为真时则执行后续操作,直到遇到#endif指令为止
预处理命令无视关于作用域的规则

2.42 用头文件来完成书店程序

//头文件程序
#ifndef SALES_DATA_H_INCLUDE
#define SALES_DATA_H_INCLUDE
#endif
#include<string>
#include<iostream>
struct Sales_data{
   std::string bookNo;
   unsigned units_soled = 0;
   double revenue =0.0;
};

//源文件部分
#include<string>
#include<iostream>
#include"Sales_data.h" 
 


int main(){
	Sales_data data1,data2;
	double price = 0;
	//读入第一条数据 
	std::cin>>data1.bookNo>>data1.units_soled>>price;
	data1.revenue=data1.units_soled*price;
	//读入第二条数据 
	std::cin>>data2.bookNo>>data2.units_soled>>price;
	data2.revenue=data2.units_soled*price;
	
	if(data1.bookNo==data2.bookNo){
		unsigned totalCnt=data1.units_soled+data2.units_soled;
		double totalRevenue=data1.revenue+data2.revenue;
		//输出 ISBN 总销售量 总销售额 平均价格
		std::cout<<data1.bookNo<<" "<<totalCnt
		         <<" "<<totalRevenue<<" ";
		if(totalCnt!=0) 
		std::cout<<totalRevenue/totalCnt<<std::endl;
		else
		std::cout<<"no sales"<<std::endl;
		return 0;
	} 
	else{
		std::cerr<<"Data must refer to the same ISBN"<<std::endl;
		return -1;
	}
}  

C++中的头文件和源文件:如何写头文件
c语言自定义头文件dev c++

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值