基本类型
字、字节、bit、Byte之间的关系
字 word
字节 Byte
位 bit
1字 = 2字节 <---> 1word = 2Byte
1字节 = 8位 <---> 1Byte = 8bit
1Byte = 8bits
1KB = 1024Bytes
1MB = 1024KB
1GB = 1024MB
#include <iostream>
using namespace std;
int main()
{
/*字符和字符串字面值
* 使用空格连接,继承C
* 字符字面值:单引号'A'
* 字符串字面值:双引号"Hello"
* 转义序列:\n、\t
* 布尔字面值:true、false
* 指针字面值:nullptr
*/
//注意:字符串是常量字符构成的数组,结尾处以'\0'结束,所以字符串类型实际上长度比内容+1
char str[20];
cin >> str; //输入"hello world"
cout << sizeof(str)<< endl; //20
cout << strlen(str) << endl;//5
}
写道这里,想到一个求字符串长度的问题 --sizeof()、size()、strlen()、length()如何区分
sizeof():操作数所占空间的字节数大小,是操作符,不是函数!!参数:类型、指针、函数
在编译时计算,不能用来返回动态分配的内存空间的大小!
输入"hello world",sizeof(str)的结果是20,sizeof()的作用是计算字符数组str所占用空间字节数的大小,进一步说明了sizeof()在编译时计算。
strlen():计算字符串长度 从第一个字符到第一个'\0'之间的元素个数* 输入"hello world",strlen(str)的结果是5,并不是11
string str1 = "hello world";
cout << str1.size() << endl;//11
cout << str1.length() << endl;//11
char a[] = "hello world";
cout << sizeof(a) << endl;//12
sizeof():计算的时候包含'\0';
变量
读到这里的时候遇到了一个不太懂的问题:
默认初始化:定义时没有指定初始化会被默认初始化,在函数体内部的内置类型变量将不会被初始化。
#include <iostream>
using namespace std;
int a;
int main()
{
int b;
cout << a << endl;//0
cout << b << endl;//error C4700: 使用了未初始化的局部变量“b”
return 0;
}
C++分区:栈区、堆区、全局静态区、常量区
a为全局变量,存储于全局静态区
b为局部变量,存储于栈区,局部变量不能默认初始化
全局变量可以统一清零,若栈区加了清零操作,会使函数调用等操作缓慢,编译器取消栈区统一清零的操作。
左值、右值、左值引用、右值引用
int a = 1;
1 = a; //表达式必须是可修改的左值
a是一个左值,1是一个右值
int a = 1;
int b = 5;
a = b;
cout << a << endl;//5
cout << b << endl;//5
C++中的左值也可以当右值使用
在这里我又又又遇到一个问题,就是GitHub.com总是打不开的情况!!!! 附上解决办法
1、打开cmd(win+R,输入cmd)
2、ping github;这一步的目的是得到github的ip地址
3、复制ip地址,打开电脑的C:\Windows\System32\drivers\etc,用记事本打开hosts文件,加上github的ip地址+github域名
这个时候问题又又又来了,我没有权限保存不了hosts,解决办法:
4、右键hosts文件的属性
到这一步,我的github.com就可以正常运行啦!
复合类型
引用
- 引用:引用是一个对象的别名,引用类型引用另一种类型。 int &b = a;
- 引用必须初始化。
- 引用和其初始值绑定在一起,不是拷贝。一旦定义就不能更改绑定为其他的对象。
指针
- int*p:指向int类型对象的指针
- 指针存放对象的地址
- 获取对象的地址:int a = 5;int *p = &a; &:取地址符
- 指针的类型与所指向的对象类型必须一致。
- 指针的四种状态:
- 指向一个对象;
- 指向紧邻对象的下一个位置;
- 空指针;
- 无效指针;(对无效指针的操作会引发异常)
- 指针访问对象:*p;*是解引用符。
- 空指针不指向任何对象。使用int *p = nullptr;使用空指针。
- void* 指针可以存放任意对象的地址。因无类型,仅操作内存空间,对所存对象无法访问。
- 建议:初始化所有指针。
- int *p1,p2; *是对p1的修饰,所以p2是int型不是指针。
引用和指针的区别,面试常考
const:定义一些不能被改变值的变量
- const对象必须初始化,且不能被改变
- const变量默认不能被其他文件访问,非要访问,必须在指定const定义之前加extern。
- 要想在多个文件中使用const变量共享,定义和生命都加extern关键字。
- const的引用:const int &a = b;可以读取但不能修改a
指针常量和常量指针
指针常量:int *const p;
int a,b;
int * const p = &a;
*p = 9;//正确
p = &b; //错误
总结:指针常量,指向不可改,内容可改
常量指针 : const int *p;
int a,b;
const int *p = &a;
*p = 9;//错误
p = &b;//正确
总结:常量指针,指向可改,内容不可改
顶层const和底层const
- 顶层 const:可以修饰所有数据类型,表示该类型的对象本身是常量
- 底层 const:与指针和引用类型有关,表示地址所指向的对象是常量
底层const==>指针常量
顶层const==>常量指针
类型别名
- typedef:定义类型的同义词,typedef int INTER;
- 新标准别名:别名声明:using int = INTER;(C++11)
对于复合类型不能代回原式进行理解
例如:
typedef char* p;//p是char*的别名
const p str = 0;//指向char的常量指针
如:const char * str = 0;//指向const char的指针
但是可代回后加括号
const (char*)str = 0;
auto类型说明符 C++11
- auto类型说明符:让编译器自动退u按类型
- 一条声明语句只能有一个数据类型,一个auto声明多个变量时只能相同的变量类型 auto a = 1,b = 0.33 //错误
decltype类型指示符(C++11)
- 从表达式的类型推断出要定义的变量的类型;
- decltype:选择并返回操作数的数据类型;
- decltype(f())sum = x;推断sum的类型是函数f()的返回类型;
- 如果对变量加括号,编译器会将其认为是一个表达式,如 int i -->(i),则decltype((i))得到结果为int& 引用;
- 赋值是会产生引用的一类典型表达式,引用的类型就是左值的类型,如果i是int,则表达式 i = x 的类型是int&。
自定义数据结构
struct
- 类可以以关键字struct开始,紧跟类名和类体
- 类数据成员:类体定义类的成员
- C++11:可以为类数据成员提供一个类内初始值
编写自己的头文件
- 头文件通常包含只能被定义一次的实体:类、const、constexpr变量(常量表达式:指值不会改变,且在编译过程中就能得到计算结果的表达式)
预处理器概述:
- 预处理器:确保头文件多次包含仍能安全工作
- 预处理器看到 #include标记时,会用指定的头文件内容代替 #include
- 头文件保护符:头文件保护符依赖于预处理变量的状态:已定义和未定义。