1、bool类型
bool有两个内建的常量,true和false
三个名字都是关键字。
bool类型只有两个值,一个true(1),一个false(0)。
给bool类型赋值时,只能赋true,false和数值(非0自动转换为1,负数也转为1)。
int main (int argc,char *argv[])
{
bool myBool = -123;
bool myBool1 = false;
bool myBool2 = true;
cout << "myBool=" << myBool <<endl;
cout << "myBool1=" << myBool1 <<endl;
cout << "myBool2=" << myBool2 <<endl;
cout << "false=" << false <<endl;
cout << "true=" << true << endl;
return 0;
}
运行结果:
2、三目运算符
a、C语言中三目运算表达式返回值为数据值,为右值,不能赋值
b、c++中三目运算表达式返回值为变量本身,为左值。可赋值
3、const修饰变量
a、C语言中:
1、const修饰全局变量num 变量名只读 内存空间在文字常量区(只读)、不能通过num的地址 修改空间内容
2、const修饰局部变量data 变量名只读 内存空间栈区(可读可写),可以通过data地址 间接的修改空间内容
b、c++语言中的中const
1、const int data = 10;//data先放入符号表
2、如果对data取地址 系统才会给data开辟空间
3、const int a = b;//b是变量名 系统直接给a开辟空间 而不放入符号表
4、cosnt 修饰自定义数据 系统为自定义数据开辟空间
c、const和#define(宏)
1、const有类型的,可进行编译器类型安全检查。#define无类型。
宏不占内存空间,但是宏展开以后的数据是要占内存的。
#define MAX 10
cout << "宏 " << sizeof(MAX) << endl;//求得是 10 的大小
2、const有作用域,#define不重视作用域,默认定义处到文件结尾。
3、宏不能作为命名空间的成员,但const可以。
#include <iostream>
using namespace std;
namespace A {
#define M 10
}
int main (int argc,char *argv[])
{
cout << A::M << endl;//err:宏是大家的,不是A自己的,将A::去掉就可以了
return 0;
}
4、引用:给已有变量取个别名
1、语法:
1、&和别名 结合 表示引用
2、给某个变量取别名 就定义某个变量
3、从上往下替换
int num = 10;
int &a = num;//此处 &不是取地址 而是标明 a是引用变量(a 是 num的别名)
注意:
a、引用必须初始化。(娃娃亲)
b、引用一旦初始化,就不能再次修改别名。(一生一世)
案例(帮助消化):
int num = 10;
int &a = num;//a就是num的别名 a==num
cout<<"num = "<<num<<endl;//10
//对a赋值 == 对num赋值
a=100;
cout<<"num = "<<num<<endl;//100
//a是num的别名 所以num和a具有相同的地址空间
cout<<"a 的地址:"<<&a<<endl;
cout<<"num 的地址:"<<&num<<endl;
结果:
2、引用给数组取别名
方法1:
int main (int argc,char *argv[])
{
int arr[4]={1,2,3,5};
int (&a)[4]=arr;//整体代换
int i = 0;
for (i=0;i<4;i++)
{
cout << a[i] <<" ";
cout << arr[i] <<" ";
}
return 0;
}
方法2:配合typedef
int main (int argc,char *argv[])
{
int arr[4]={1,2,3,5};
typedef int TYPE_ARR[4];//用typedef给数组取个别名
TYPE_ARR &myArr = arr;//数组的别名
int i = 0;
for (i=0;i<4;i++)
{
cout << myArr[i] <<" ";
cout << arr[i] <<" ";
}
return 0;
}
3、引用作为函数的参数(作用跟指针相似)
void my_swap1(int a,int b)
{
int tmp = a;
a = b;
b=tmp;
}
void my_swap2(int *a,int *b)//a=&data1,b =data2;
{
int tmp = *a;
*a = *b;
*b = tmp;
}
void my_swap3(int &a, int &b)//a=data1,b=data2
{
int tmp = a;
a = b;
b= tmp;
}
void test04()
{
int data1 = 10,data2=20;
cout<<"data1 = "<<data1<<", data2 = "<<data2<<endl;
//my_swap1(data1,data2);//交换失败
//my_swap2(&data1,&data2);//交换成功
my_swap3(data1,data2);//交换成功(推荐)
cout<<"data1 = "<<data1<<", data2 = "<<data2<<endl;
}
4、引用作为函数的返回值
函数返回啥变量,引用就是该变量的别名
注意:不要返回局部变量哦,可以来个静态局部变量
5、 引用的本质:
引用的本质在c++内部实现是一个指针常量. Type& ref = val; // Type* const ref = &val;
c++编译器在编译过程中使用常指针作为引用的内部实现,因此引用所占用的空间大小与指针相同,只是这个过程是编译器内部实现,用户不可见
6、常引用
typedef struct
{
int num;
char name[32];
}STU;
void myPrintSTU1(STU tmp)//普通结构体变量作为形参 开销太大
{
cout<<sizeof(tmp)<<endl;
cout<<"学号:"<<tmp.num<<", 姓名:"<<tmp.name<<endl;
}
void myPrintSTU2(const STU &tmp)//STU &tmp=lucy;tmp是lucy的别名 tmp没有开辟独立空间
{
//tmp.num = 2000;//err 因为tmp为常引用
cout<<"学号:"<<tmp.num<<", 姓名:"<<tmp.name<<endl;
}
void test08()
{
STU lucy = {100,"lucy"};
//需求:定义一个函数 遍历lucy成员(读操作)
myPrintSTU2(lucy);
}