首页 > 其他分享 >条款03: 尽可能使用const

条款03: 尽可能使用const

时间:2024-09-07 15:03:34浏览次数:5  
标签:std 03 const 尽可能 text greeting char Rational

1. 在classes外部修饰global或namespace作用域内的常量,或修饰文件、函数、或区块作用域中被声明为static的对象
2. 修饰classes内部的static和non-static成员变量
3. 可以指出指针自身、指针所指之物,或两者都不是,都是const

char greeting[] = "Hello";
char* const p00 = greeting;//const pointer
const char* p01 = greeting;//const data
char const* p02 = greeting;//const data
char* p03 = greeting;//no const
const char* const p04 = greeting; //const data/pointer

1. 声明迭代器为const就像声明指针为const一样(即T*const),表示这个迭代器不得指向不同的东西,但所指的东西值是可以改动的
2. 希望迭代器所指的东西不可改动(即const*T),需要的是const_iterator

void Test00()
{
	std::vector<int> vec(1);
	const std::vector<int>::iterator Iter = vec.begin();
	*Iter = 10;
	//++Iter; //const pointer

	std::vector<int>::const_iterator cIter = vec.begin();
	//*cIter = 10; //const data
	++cIter;
}

1. 令函数返回一个常量值,往往可以降低因客户错误而造成的损失,而又不至于放弃安全性和高效性

class Rational
{
public:
	Rational() = default;
	~Rational() = default;
};

const Rational operator*(const Rational& lhs, const Rational& rhs)
{
	return Rational();
}

void Test01()
{
	Rational A, B, C;
	A = B * C;
	//B* C = A; //const 不能再赋值
}

1. const成员函数可作用于const对象,class接口容易理解
2. 两个成员函数const和非const可以重载

class TextBlock
{
public:
	TextBlock(const std::string& sText) :
		text(sText)
	{

	}
	const char& operator[](std::size_t position)const
	{
		std::cout << "const ";
		return text[position];
	}
	char& operator[](std::size_t position)
	{
		std::cout << "no const ";
		return text[position];
	}
private:
	std::string text;
};

void Test02()
{
	TextBlock tb("Hello");
	tb[0] = 'X';
	std::cout << tb[0] << std::endl;

	const TextBlock ctb("World");
	//ctb[0] = 'X'; //const data
	std::cout << ctb[0] << std::endl;
}

1. 利用mutable 释放掉non-static成员变量的const约束

class CTextBlock
{
public:
	CTextBlock(const std::string& sText) :
		text(sText)
	{

	}
	std::size_t length()const
	{
		if (!lengthIsValid)
		{
			textLength = text.length(); //const函数可以修改
			lengthIsValid = true;
		}
	}
private:
	std::string text;
	mutable std::size_t textLength;
	mutable bool lengthIsValid;
};

1. non-const调用const 成员函数避免重复
2. 第一次转换为*this添加const,接下来调用const成员函数
3. 第二次转换在返回值移除const

class CastTextBlock
{
public:
	CastTextBlock(const std::string& sText) :
		text(sText)
	{

	}
	const char& operator[](std::size_t position)const
	{
		std::cout << "const ";
		return text[position];
	}
	char& operator[](std::size_t position)
	{
		std::cout << "no const ";
		return const_cast<char&>
			(static_cast<const CastTextBlock&>(*this)[position]);
	}
private:
	std::string text;
};

void Test03()
{
	TextBlock tb("Hello");
	tb[0] = 'X';
	std::cout << tb[0] << std::endl;

	const TextBlock ctb("World");
	//ctb[0] = 'X'; //const data
	std::cout << ctb[0] << std::endl;
}

int main()
{
	Test00();
	Test01();
	Test02();
	Test03();
	return EXIT_SUCCESS;
}

  

标签:std,03,const,尽可能,text,greeting,char,Rational
From: https://www.cnblogs.com/BoYuCG/p/18401684

相关文章

  • 微服务实战——品牌管理(JSR303,SKU&SPU)
    品牌管理1.JSR3031、给Bean添加校验注解:javax.validation.constraints,并定义自己的message提示2、开启校验功能@Valid  效果:校验错误以后会有默认的响应;3、给校验的参数bean后紧跟一个BindingResult,就可以获取到校验的结果4、分组校验(多场景的复杂校验)    1......
  • CF2009G. Yunli's Subarray Queries 题解
    G1题目要求,对于一个子区间$a_{l\siml+k-1}$,最少要进行多少次单点修改,才能使$\forall\l<i\leql+k-1,a_i=a_{i-1}+1$,其中$k$是固定的。对于这种问题,我们通常有一个trick:将$a_i$变为$a_i-i$。这样的话,我们要求的答案就变为了$k$减去变化后的$a_{l\siml+k-1}$......
  • STM32系列修改外部晶振以及代码的修改(f103、f105为例)
    此文章为引用正点原子详细讲解刚刚接触STM32的时候,用的都是8M晶振。比如你想更换到为外部晶振为12M,但是主频仍想用72M的。该如何设置?或者想倍频到更高的主频该怎么修改?例子就直接直接拿<正点原子>的例子吧!属性原来现在外部晶振8M12M倍频96主频72M72M想从原来的8......
  • 南阳收费站(兰南高速出口) 向东北方向出发,沿南阳立交桥走390米,直行进入S103
    南阳收费站(兰南高速出口)向东北方向出发,沿南阳立交桥走390米,直行进入S103走1.8公里,直行进入李庄桥走30米,直行进入S103走600米,直行进入鲁平庄桥走10米,直行进入S103走590米,直行进入强营桥走30米,直行进入S103走2.4公里,直行进入红泥湾桥......
  • Keysight U8031A DC power supply
    KeysightU8031ADCpowersupply文章目录KeysightU8031ADCpowersupply前言电容充电⽰意图一、恒定电压操作二、恒定电流操作三、5v操作四、跟踪模式操作五、存储器操作六、对过电压保护编程七、对过电流保护编程八、锁键操作前言U8031APowerSupply是一款......
  • VUE0003:Naive UI库:滑动条,单选,多选组件
    1,滑动条,单选,多选组件 <template><n-scrollbarclass="show-scrollbar"><n-spaceclass="map-setting"vertical><n-spacestyle="flex-flow:row;align-items:center;"><n-textclass=&q......
  • 用“说”智能控制灯具开关语音识别芯片NRK3603
    用“说”智能控制灯具开关是一种基于语音识别技术的智能家居设备,它通过内置的语音识别芯片,利用离线识别算法,将用户的语音指令实现对灯具的控制,NRK3603语音识别芯片成为客户低成本的离线语音识别方案。功能特性:1.内核和存储高性能32bitRlsc内核,主频160MHZ,内置4MBSPIFLASH。2.AI算......
  • [ABC137F] Polynomial Construction 题解
    明明有最厉害最好想的插值做法,怎么没有人写呢。思路考虑\(n\)个点可以确定一个\(n-1\)次多项式。如何确定。令\(l_i(x)=\prod_{j\not=i}\frac{(x-x_j)}{(x_i-x_j)}\)。可以发现这个多项式在\(x=x_i\)时值为一,在\(x=x_j(j\not=i)\)时值为零。那么就有:\[F(x)=\su......
  • 条款02: 尽量以const,enum,inline 替换 #define
    宏实现1.宏定义有可能从未被编译器看到,找不到宏定义2.宏有可能存在多份#defineASPECT_RATIO1.6531.宏实现函数,必须为宏中所有实参加上(),即使加上也会有被多次调用template<typenameT>inlinevoidprint(Tdata){ std::cout<<data<<std::endl;}#define......
  • 洛谷 P3034 Cow Photography G/S——题解
    洛谷P3034题解传送锚点摸鱼环节[USACO11DEC]CowPhotographyG/S题面翻译题目描述今天的奶牛们特别调皮!FarmerJohn想做的只是给排成一排的奶牛拍照,但是在他拍下照片之前,奶牛们一直在移动。具体地说,FJ有\(N\)头奶牛(\(1\leqN\leq20\,000\)),每头奶牛都有一个唯一确......