1.定义和声明
// C++可以在任意位置定义变量,尽量减少变量的作用域 -----> 尽可能延迟变量的定义 -----> 什么时候用,什么时候定义
2.寄存器变量
// 申请一个寄存器变量,变量不存在内存中,
// 而是直接存在寄存器中
// 请求,请求不一定能够成功
// 而是直接存在寄存器中
// 请求,请求不一定能够成功
register int b = 20;
// C++中 如果对一个寄存器变量进行取地址操作
// register 声明将变的无效,编译器将这个又放回内存中
// register 声明将变的无效,编译器将这个又放回内存中
3.结构体
struct Student
{
int id;
char name[20];
};
int id;
char name[20];
};
int main()
{
// C语言中结构体不认为是一个新的数据类型,只是数据的集合
struct Student s;
{
// C语言中结构体不认为是一个新的数据类型,只是数据的集合
struct Student s;
// C++中认为结构体是一个新的数据类型,可以直接来定义变量
Student s1;
Student s1;
return 0;
}
}
4.新增BOOL类型
// bool类型:只有两个值,真(true)和假(false)
// 真(true)值是1, 假(false)值是0
// 真(true)值是1, 假(false)值是0
// 如何判断 真和假
// 真:所有非0都是真 真的值是1
// 假:0 是假
// 真:所有非0都是真 真的值是1
// 假:0 是假
// 判断真
if (b)
if (b)
// 判断假
if (!b)
if (!b)
5.三目运算符
int c = a>b ? a : b;
// C++三目运算符可以作为左值来使用
// C++三目运算符返回的是变量本身
(a>b ? a: b) = 0; // *(a>b ? &a : &b) = 0;
// C++三目运算符返回的是变量本身
(a>b ? a: b) = 0; // *(a>b ? &a : &b) = 0;
// 如果将三目运算符作为左值来使用,则表达式中不能存在常量
// (a>b ? a: 30) = 23; // *(a>b ? &a : &30) = 23;
// (a>b ? a: 30) = 23; // *(a>b ? &a : &30) = 23;
6.const
// C++ 中的const 修饰变量,则变量将会变量一个常量
// 常量在内存中是没有分配空间的
// 编译器有一个符号表用来存储常量的
// 常量在内存中是没有分配空间的
// 编译器有一个符号表用来存储常量的
const int a = 10;
// 如果对有一个const常量进行取地址操作,编译器会为这个const常量分配一个空间
// const 常量并不会使用这块空间
int *pa = (int*)&a;
*pa = 20;
// const 常量并不会使用这块空间
int *pa = (int*)&a;
*pa = 20;
7.引用
// a 是变量名 代表一块 4字节的空间 空间内的值是10
// 这块 空间 能不能起另一个名字? -----> 引用
int a = 10;
// 这块 空间 能不能起另一个名字? -----> 引用
int a = 10;
// 引用 :类型 &别名 = 原来的变量名
// b 是 a 的引用,也就是 a 所代表的4字节空间的别名
// 现在, a 和 b 代表的是同一块空间
// 对 b 的操作就是对 a 的操作, 对 a 的操作就是对 b 的操作
int &b = a;
// b 是 a 的引用,也就是 a 所代表的4字节空间的别名
// 现在, a 和 b 代表的是同一块空间
// 对 b 的操作就是对 a 的操作, 对 a 的操作就是对 b 的操作
int &b = a;
// 引用:在一定场合 用来替换指针
void swap(int &a1, int &b1)
{
int tmp = a1;
a1 = b1;
b1 = tmp;
}
void swap(int &a1, int &b1)
{
int tmp = a1;
a1 = b1;
b1 = tmp;
}
// 引用变量必须要初始化
// 复杂数据类型做参数传递的时候,不要直接传变量
// 传指针
void print(Student *ps)
// 传引用
void print1(Student &s1)
void print1(Student &s1)
// 函数返回值返回一个引用: 不能返回一个栈上变量的引用
// 可以返回的引用:全局变量、静态变量、堆上的变量....
int &func()
{
static int a = 10;
printf ("a = %d\n", a);
return a;
}
// 可以返回的引用:全局变量、静态变量、堆上的变量....
int &func()
{
static int a = 10;
printf ("a = %d\n", a);
return a;
}
8.引用本质和常引用
// 引用:占4字节空间(指针) 必须要初始化(const 常量)
// ======> 引用的内部实现 const 常量指针
// int &b = a =====> int *const b = &a
// int &b = a =====> int *const b = &a
// 用引用的时候 都是 *pb 去替换
printf ("&b = %p\n", &b); // printf ("&b = %p\n", &*pb);
printf ("&b = %p\n", &b); // printf ("&b = %p\n", &*pb);
//常引用
// 1、用变量对常引用进行初始化
const int &c = a; // const int * const pc = &a;
const int &c = a; // const int * const pc = &a;
// 2、使用常量对常引用进行初始化
// 引用是一个空间的别名 ----> 缺空间
// 编译器会为这个常量开辟新的空间,将这个常量的值赋值给这个空间
// 同时将 d 作为这个空间的别名
const int &d = 20; // const int * const pd = &20;
// 引用是一个空间的别名 ----> 缺空间
// 编译器会为这个常量开辟新的空间,将这个常量的值赋值给这个空间
// 同时将 d 作为这个空间的别名
const int &d = 20; // const int * const pd = &20;
// e 是一个常量,值永远都是 25
const int e = 25;
const int e = 25;
b = 20; // *pb = 20;