C++ 布尔 const 引用 默认参

day02

1.布尔

C语言使用布尔类型的方法如下

//利用宏
#include<stdio.h>
typedef int BOOL;
#define TRUE 1
#define	FALSE 0
int main()
{
	BOOL bVal = TRUE;
	bVal = FALSE;

	bVal = 8;//可读性差

}

c++中直接使用 bool,如下

//利用关键字
int main()
{
	bool bVal = true;
	bVal = false;
    
    bVal =2;//非零为真。。内存为  01
    //bool只有一个字节
    
    
	
}

2.const

相比于C语言优化了无参宏。

宏缺点:1)没有类型检查 2)没有符号(无法调试)

const int VAL = 10000;//定义了一个常量

int main()
{
	char ch = VAL;
	cout << ch << endl;
	*(int*)&VAL = 10;//不能更改,发在只读数据区
	const int val = 1000;
	*(int*)&val = 10;
	cout << val << endl;//const 修饰的是常量,在编译过程中会进行替换,将val替换成1000
	return 0;
}
//修饰指针防止误操作
void ShowArray(const int* pAry, int nCnt)
{
	//pAry[2] = 5566; 
	*(int*)(pAry + 2) = 5566;//不能修改是语法层的限制
	for (int i = 0; i < nCnt; i++)
	{
		cout << pAry[i] << " ";
	}
	cout << endl;
}
int main()
{
	int ary[] = { 12,312,312,123,41,231 };
	ShowArray(ary, sizeof(ary) / sizeof(ary[0]));
	return 0;
}

const tpye* p

 // const tpye* p ; p指向的内容不可以被修改,p本身可以被修改	
	int n = 1;
	int n2 = 3;
	const int* p = &n;
	p = &n2;
	//*p = 8;

tpye const* p

// tpye	const * p ; p指向的内容不可以被修改,p本身可以被修改	
	int n = 1;
	int n2 = 3;
	int const* p = &n;
	p = &n2;
	//*p = 8;

tpye* const p

 // const tpye* p ;p指向的内容可以被修改,p本身不可以修改。
	int n = 1;
	int n2 = 3;
	int* const p = &n;
	//p = &n2;
	*p = 8;

const tpye* const p

//const tpye* const p ;p指向的内容不可以被修改,p本身不可以被修改
	int n = 1;
	int n2 = 3;
	int const* const p = &n;
	p = &n2;
	*p = 8;

eg:

	int nVal1 = 8;
	int nVal2 = 9;

	const int* p1 = &nVal1;
	int const* p2 = &nVal2;

	const int* const p3 = &nVal1;
	const int* const p4 = p1;
	const int* const p5 = p2;

	//int* p6 = p1;//int*与const int*类型不匹配
	//int* p7 = p3;//int*与const int*类型不匹配
	const int* p8 = p3;
	//int* const p9 = p3;//int*与const int*类型不匹配
	//int* const p10 = p1;//int*与const int*类型不匹配

3.引用

指针的危害

//可能误用到野指针,。空指针
void Swap(int* pn1, int* pn2)
{
	int nTmp = *pn1;
	*pn1 = *pn2;
	*pn2 = nTmp;
}
int main()
{
	int n1 = 2;
	int n2 = 3;
    //Swap(nullptr,&n2);//报错。访问权限
	int* p = (int*)malloc(4);
	free(p);
	//Swap(p, &n2); 使用了野指针。
}

使用引用的两数交换

void SwapXXXX(int& nRef1, int& nRef2)
{
	int nTmp = nRef1;
	nRef1 = nRef2;
	nRef2 = nTmp;
}
int main()
{
	int n1 = 2;
	int n2 = 3;

	SwapXXXX(n1, n2);
}

引用的基础了解

int main()
{
	//引用:起别名
	int n1 = 2;
	int& n1Ref = n1;
	int& n1Ref2 = n1;
	n1Ref = 5;
	n1Ref2 = 2;
}

引用与指针的区别

int main()
{
	//引用与指针的区别
	//int& nRef;//报错,引用必须初始化
	//int n = 9;
	//int& nR1 = n;
	//int&& nR2 = nR1;//引用没有多级引用
	//int n1 = 8;
	//nR1 = n1;//引用不能改变引用的变量,这里其实是赋值语句
	//int& n = 9;//应用不能引用常量
	const int& n = 9;//const修饰的引用可以引用常量

}

引用适用于所有类型

#if 0
int& func()
{
	int n = 9;
	return n;
}
int main()
{
	//int& nRef1 = func();//不要返回局部变量的引用,因为局部变量当函数使用完后会释放掉
	//引用可以用于所有类型
	float f = 3.21f;
	float& fR = f;
	fR = 8.6f;
	char ch = 'a';
	char& chR = ch;
	chR = 'b';
	struct tagTest
	{
		int m_n;
		float m_f;
	};
	tagTest t;
	tagTest& tR = t;
	t.m_f = 6.54f;
	t.m_n = 12;


	int n4 = 9;
	int* pn4 = &n4;
	int*& pn4R = pn4;
	int n5 = 98;
	pn4R = &n5;
	*pn4R = 69;
}

引用的本质还是指针

//通过调试查看堆栈可知道引用的本质还是指针
void SwapXXXX(int& nRef1, int& nRef2)
{
	int nTmp = nRef1;
	nRef1 = nRef2;
	nRef2 = nTmp;
}
int main()
{
	int n1 = 2;
	int n2 = 4;
	SwapXXXX(n1, n2);//引用本质还是指针
}

4.默认参

1.当函数调用没有提供实参的时候,会使用默认参
2.如果提供了实参,则会使用实参。
3.默认参必须从右向左依次设置,中间不能间断
4.默认参要放到声明里面,不能同时放到声明和实现中。

使用宏定义

void Say(const char* szUser, const char* szCon)
{
    cout << szCon << "打招呼" << szCon << endl;

}
#define SAY(szUser) Say(szUser,"你好")
int main()
{

    SAY("安安");//放在常量数据区,不可被修改
  
    Say("啊瑟", "你好");

}

使用默认参数

void Say(const char* szUser, const char* szCon="你好")
{
    cout << szCon << "打招呼" << szCon << endl;

}
int main()
{

    Say("莫再提");
    Say("莫再提");
    Say("莫再提");
    Say("西门吹雪", "吃了");

    std::cout << "Hello World!
";
}

注意:一般在.h文件中定义函数声明。

原文地址:https://www.cnblogs.com/pupububu/p/14160693.html