三目运算符
C语言返回变量的值 C++语言是返回变量本身。
代码:
int a = 10;
int b = 20;
(a < b ? a : b) = 30;
cout << a << endl;// 输出的结果是a=30;
(a < b ? a : b) 返回的是一个内存空间,内存地址。
如何做到?
原理如下:*(a>b?&a:&b)
const
struct Teacher
{
char name[64];
int age;
};
int oop(const Teacher *pT) // pt不能被修改。
{
// pT->age = 10;
return 1;
}
int op(Teacher *const pT) // pt的地址不能被修改。
{
pT->age = 10;
pt->null;//报错。
}
- c语言中的const 能被修改
- C++中const是一个真正的常量
代码如下:输出10;
const int a = 10;
int *p = NULL;
p = (int *)a;
*p = 20;
cout << a << endl;
原理如下:
当我们执行 p = (int *)a这行代码时,C++编译器会单独的为a开辟另一块空间,放改变后的变量,但是不会改变在符号表中的值,
const关键字结论:
结论: - C语言中的const变量
C语言中const变量是只读变量,有自己的存储空间
- C++中的const常量
可能分配存储空间,也可能不分配存储空间
当const常量为全局,并且需要在其它文件中使用
当使用&操作符取const常量的地址
const和#define的相同之处:
C++中const是一个真正意义上的常量,不能被修改,#define也可以定义一个常量。
const代码:(在C++中能编译通过)
const int a = 10;
const int b = 20;
int array[a + b];
const和#define的区别:
const常量是由编译器处理的,提供类型检查和作用域检查
宏定义由预处理器处理,单纯的文本替换
代码如下:
void fun1()
{
#define a 10
const int b = 20;
#undef a //卸载宏定义,当加入这行语句就是限制了a的作用域范围,这时候a就不能在b中使用。
}
void fun2()
{
cout << a << endl;
// cout << b << endl; // 在这个函数中不能被使用。
}
int main()
{
fun1();
fun2();
system(“pause”);
return 1;
}
C++中的引用
问题的提出,如果给a分配了一个内存空间,还能为这个内存空间再取一个别名吗?
代码感受:
int a = 10;
int &b = a; // 给a取了一个别名。
b = 100;//这行代码修改了,a的值。
cout << b << endl;// b=10;
-
引用必须要初始化,下面代码错误。
int &b; //没有初始化。
-
典型例子:数字交换
代码:
void swap(int a, int b)
{
int c = 0;
c = a;
a = b;
b = c;
}
int main()
{
int x = 10, y = 20;
swap(x, y);
}
上面的这个方式不能交换a和b,通过C语言中的指针改进,代码如下:
void swap2(int *a, int *b)
{
int c = 0;
c = *a;
*a = *b;
*b = c;
}
int main()
{
int x = 10, y = 20;
swap2(&x, &y);
}
通过引用改进:
void swap(int &a, int &b)
{
int c = 0;
c = a;
a = b;
b = c;
}
复杂数据类型记忆函数引用
代码如下:
void printfpt1(Teacher *pT)
{
cout << “printfpt1的age:” << pT->age << endl;
pT->age = 33;
}
void printfpt2(Teacher &pT)
{
cout << “printfpt2的age:” << pT.age << endl;
pT.age = 33;
}
void printfpt3(Teacher pT)
{
pT.age = 45; //这个pt
cout << “printfpt3的age:” << pT.age<< endl;
}
int main()
{
Teacher t1;
t1.age = 35;
//printfpt3(t1);//输出35
//printfpt2(t1); //输出33.
printfpt1(&t1);//输出33.
printfpt1(&t1);
}
引用的本质和意义。
引用的本质实质上是编译器帮我们取了一个地址。
当函数返回值为引用时
若返回栈变量
不能成为其它引用的初始值
不能作为左值使用
int getAA1()
{
int a;
a = 10;
return a;
}
int& getAA2() // a的地址
{
int a; //当函数的返回值为引用时,若返回的是栈变量,不能作为其他引用的初始值,不能当左值。
a = 10;
return a;
}
int* getAA3()
{
int a;
a = 10;
return &a;
}
int main()
{
int a1 = getAA1();
int a2 = getAA2();
int &a3 = getAA2();// a3存放的是getAA2的地址。 //当函数的返回值为引用时,若返回的是栈变量,不能作为其他引用的初始值,不能当左值。
cout << "a1 " << a1 << endl;
cout << "a2 " << a2<<endl;
cout << "a3 " <<a3<< endl;
system("pause");
return 1;
}
若返回静态变量或全局变量
可以成为其他引用的初始值
即可作为右值使用,也可作为左值使用
代码:
int getAA1()
{
static int a;
a = 10;
return a;
}
int& getAA2() // a的地址
{
static int a; //当函数的返回值为引用时,若返回的是栈变量,不能作为其他引用的初始值,不能当左值。
a = 10;
return a;
}
int* getAA3()
{
static int a;
a = 10;
return &a;
}
int main()
{
int a1 = getAA1();
int a2 = getAA2();
int &a3 = getAA2();// a3存放的是getAA2的地址。 //当函数的返回值为引用时,若返回的是栈变量,不能作为其他引用的初始值,不能当左值。
cout << "a1 " << a1 << endl;
cout << "a2 " << a2<<endl;
cout << "a3 " <<a3<< endl; // a3出现乱码情况,原因如下。
system("pause");
return 1;
}
//程序运行完毕,就释放了内存。
函数引用返回变量本身
代码
int &a1()
{
static int a = 10;
a++;
cout << a << endl;
return a;
}
int main()// 第一次执行a1时,返回的是,静态变量a++;第二次执行时,把100赋给a,最后结果是101。
{
a1() = 100; //引用当左值。
a1();
int c = a1(); // c当右值。
system(“pause”);
return 1;
}