1>C++中的布尔类型
C++在C语言的基本类型系统之上增加了bool,C++中的bool可取的只只有true和false;
理论上bool只占用一个字节,但如果多个bool变量定义在一起,可能会各占一个bit,这取决于编译器
的实现。
Tip: true代表真值,编译器内部用1来表示;false代表非真值,编译器内部用0来表示。
例1:
-
#include <stdio.h>
-
-
int main(int argc, char *argv[])
-
{
-
int a;
-
bool b = true;
-
-
printf("b = %d, sizeof(b) = %d\n", b, sizeof(b));
-
-
b = 3;
-
a = b;
-
-
printf("a = %d, b = %d\n", a, b);
-
-
b = -5;
-
a = b;
-
-
printf("a = %d, b = %d\n", a, b);
-
-
a = 10;
-
b = a;
-
-
printf("a = %d, b = %d\n", a, b);
-
-
b = 0;
-
-
printf("b = %d\n", b);
-
-
printf("Press enter to continue ...");
-
getchar();
-
return 0;
-
}
bool类型只有true(非0)和false(0)两个值,C++编译器在复制时将非0值转换为true,0值转换为
false。
例2:
-
#include <stdio.h>
-
-
int main(int argc, char *argv[])
-
{
-
bool b = false;
-
-
printf("b = %d\n", b);
-
-
b++;
-
-
printf("b = %d\n", b);
-
-
b = b + 1;
-
-
printf("b = %d\n", b);
-
-
printf("Press enter to continue ...");
-
getchar();
-
return 0;
-
}
2>三目运算符的升级,
例3:
-
#include <stdio.h>
-
-
int main(int argc, char *argv[])
-
{
-
int a = 1;
-
int b = 2;
-
-
(a < b ? a : b) = 3;
-
-
printf("a = %d, b = %d\n", a, b);
-
-
printf("Press enter to continue ...");
-
getchar();
-
return 0;
-
}
C语言中的三目运算符返回的是常量值,不能作为左值使用;而C++中的三目运算符可能返回变量本
身,因此可以出现在程序的任何地方。但是:三目运算符可能返回值中如果有一个是常量值,则不能
作为左值使用。以此我们就会好奇C++对三目运算符做了什么呢?
3>C++中的引用
1、在C++中新增加了引用的概念,引用可以看作一个已定义变量的别名
引用的语法:Type& name = var;
例4:
-
#include <stdio.h>
-
-
int main(int argc, char *argv[])
-
{
-
int a = 4;
-
int& b = a;
-
-
b = 5;
-
-
printf("a = %d\n", a);
-
printf("b = %d\n", b);
-
printf("&a = %08X\n", &a);
-
printf("&b = %08X\n", &b);
-
-
printf("Press enter to continue ...");
-
getchar();
-
return 0;
-
}
Tip:普通引用在声明时必须用其他的变量进行初始化。
2、引用的意义
引用作为其它变量的别名而存在,因此在一些场合可以代替指针;引用相对于指针来说具有更好
的可读性和使用性。
swap函数的实现对比:
例5:
-
#include <stdio.h>
-
-
void swap(int& a, int& b)
-
{
-
int t = a;
-
a = b;
-
b = t;
-
}
-
-
int main(int argc, char *argv[])
-
{
-
int a = 4;
-
int b = 5;
-
-
swap(a, b);
-
-
printf("a = %d\n", a);
-
printf("b = %d\n", b);
-
-
printf("Press enter to continue ...");
-
getchar();
-
return 0;
-
}
Tip:引用作为函数参数声明时不进行初始化。
3、const的引用
在C++中可以声明const引用;const Type& name = var;const引用让变量拥有只读属性。
例6:
-
#include <stdio.h>
-
-
int main(int argc, char *argv[])
-
{
-
int a = 4;
-
const int& b = a;
-
int* p = (int*)&b;
-
-
//b = 5;
-
-
*p = 5;
-
-
printf("a = %d\n", a);
-
printf("b = %d\n", b);
-
-
printf("Press enter to continue ...");
-
getchar();
-
return 0;
-
}
当使用常量对const引用进行初始化时,C++编译器会为变量值分配空间,并将引用名作为这段空间爱你的别名。
例7:
-
#include <stdio.h>
-
-
int main(int argc, char *argv[])
-
{
-
const int& b = 1;
-
int* p = (int*)&b;
-
-
//b = 5;
-
-
*p = 5;
-
-
printf("b = %d\n", b);
-
-
printf("Press enter to continue ...");
-
getchar();
-
return 0;
-
}
例8:引用有自己的存储空间
-
#include <stdio.h>
-
-
struct TRef
-
{
-
int& a;
-
int& b;
-
};
-
-
int main(int argc, char *argv[])
-
{
-
printf("sizeof(TRef) = %d\n", sizeof(TRef));
-
-
printf("Press enter to continue ...");
-
getchar();
-
return 0;
-
}
引用在C++中的内部实现是一个常指针:Type& name <--> Type* const name
Inprotance
C++编译器在编译过程中使用常指针作为引用的内部实现,因此引用所占用的空间大小与指针相同。
从使用的角度,引用会让人误会其只是一个别名,没有自己的存储空间。这是C++为了实用性而作出的细节隐藏。
例9:
-
#include <stdio.h>
-
-
struct TRef
-
{
-
int& a;
-
int& b;
-
int& c;
-
};
-
-
int main(int argc, char *argv[])
-
{
-
int a = 1;
-
int b = 2;
-
int c = 3;
-
TRef rA = {a, b, c};
-
-
printf("&a = %08X\n", &a);
-
printf("&b = %08X\n", &b);
-
printf("&c = %08X\n", &c);
-
printf("&rA = %08X\n", &rA);
-
printf("sizeof(TRef) = %d\n", sizeof(rA));
-
-
printf("Press enter to continue ...");
-
getchar();
-
return 0;
-
}
4、当函数返回值为引用时
若返回栈变量:不能成为其它引用的初始值,不能作为左值使用。
若返回静态变量或全局变量:可以成为其他引用的初始值,即可以作为右值使用,也可作为左值使用。
例10:
-
#include <stdio.h>
-
-
int& f()
-
{
-
static int a = 0;
-
-
return a;
-
}
-
-
int& g()
-
{
-
int a = 0;
-
-
return a;
-
}
-
-
int main()
-
{
-
int a = g();
-
int& b = g();
-
-
f() = 10;
-
-
printf("a = %d\n", a);
-
printf("b = %d\n", b);
-
printf("f() = %d\n", f());
-
-
printf("Press enter to continue ...");
-
getchar();
-
return 0;
-
}
C++对三目运算符做了什么
当三目运算符的可能值都是变量时,返回的是变量引用,当三目运算符的可能返回中有常量时,
返回的是值,不能作为右值使用。
小结:bool类型是C++新增加的基础类型,起值只能是true和false;
C++中的引用可以看作变量的别名来使用;
C++中的引用可以使得一个变量拥有只读属性;
C++中的常引用可以用常量初始化而得到一个只读变量;
C++中引用的本质是一个指针常量。
阅读(1496) | 评论(0) | 转发(0) |