目录
1.基本内置类型的定义及初始化
char c_1='A';
int i_1= 0;
unsigned i_2= 0;
float f_1=3.14159;
1.1列表初始化
int i_2= {0};
int i_4{0};
1.2默认初始化
当变量没有给定初值时,会被赋予默认值,这就是默认初始化。具体默认值是多少由变量的类型及变量所在的位置决定。
内置类型:定义在全局,默认初始值为0;定义在局部(函数内),默认初始值是随机的(未定义)
类类型:初始化对象的方式由类自己决定
#include<iostream>
#include<string>
using namespace std;
int g_a;
int main()
{
int a;
string str;
return 0;
}
1.3拷贝初始化与直接初始化
当使用等号(=)来初始化变量时,便执行拷贝初始化,编译器会把等号右边的值拷贝到创建的对象中。反之,执行的便是直接初始化
1.4值初始化
只提供对象可容纳元素的数目,未确定初始值,由库确定初值并赋给所有的元素,即给定大小,未定内容;
2.复合数据类型定义及初始化
复合类型,基于其他类型而定义的类型。包括引用,指针等等
2.1引用
int val=222;
int &ref_val=val;
注意的点:引用即别名;定义必绑定;类型需匹配;不可引用本身(引用不是对象);
2.2指针
int *p1; //定义但未初始化
int val=0;
int *p1=&val; //定义同时初始化
int v_p=*p1; //获取指针所指对象的值初始化变量
int **pp=&p1; //定义二级指针并初始化
bool fun_compare_str(const string &,const string &);//函数声明
bool (*p_fun)(const string &,const string &); //定义了一个函数指针
bool *p_fun(const string &,const string &); //返回bool指针的函数
shared_ptr<T> sp ; //定义共享智能指针sp
auto sp1=make_shared<int>(42) ; //定义智能指针的另一种方式,使用make_shared()
unique_ptr<T> up ; //定义独占智能指针up
注意的点:
指针是对象,分配有某一内存空间,因此可以定义指针的引用,也能拷贝、赋值
指针的默认初始化方式跟内置类型一样
指针值有以下四种情况:为空;无效;指向对象;指向对象下一地址
指针访问通过*运算符
3.数组的定义及初始化
数组类似于向量容器,但在灵活性与性能上有所区分
const unsigned sz=100; //将sz声明为拥有常量属性,用于确定数组维度
int arr_1[sz]; //可以存放100个整形数的数组
int *arr_2[sz]; //可以存放100个指向整形的指针的数组
string arr_3[sz]; //可以存放100条字符串的数组
char arr_4[sz]; //可以存放100个字符的数组
char arr_5[sz][sz]; //100*100的二维数组
int (*p_arr1)[sz]=&arr_1; //!!这是一个指针,指向容纳100个整型数的数组
int (&r_arr1)[sz]=arr_1; //这是一个引用,引用了一个容纳100个整形数的数组
注意的点:不能定义存放引用的数组,即int &arr[100]=/*?*/;不存在
3.string对象的定义及初始化
string s1; //未给初值,执行默认初始化,string默认为空串
string s2(s1); //未使用等号,执行直接初始化
string s3=s2; //使用了‘=’,拷贝初始化
string s4("hello,hhh"); //用字符串常量初始化string,空字符丢弃
string s5="hello,hhh"; //拷贝初始化
string s6(10,'h'); //直接初始化,适用于多个值的情况
string s7=string(10,'h'); //初始化多个值,但使用了拷贝初始化,创建了临时对象
char ch[]="hello.";
char* p_arr=ch[0];
string s8(p_arr,n); //从指针p_arr指向的数组中拷贝前n个字符
string s9(s4,pos) ; //从string类型的s4中拷贝下标pos,及其之后的字符内容
//pos>s4.size()则拷贝未知范围内容,操作未定义
string s10(s4,pos1,len); //类似于s9,但用参数len指出了拷贝的数量,len过大,按有效范围拷贝;
4.vector对象的定义跟初始化
vector<T> v1;
vector<T> v2(v1);
vector<T> v3=v1;
vector<T> v4{a,b,c,...}; //而string的形式是s(“dkshks”)
vector<T> v5={a,b,c,...}; //v4等价方式,对应的string形式为s="shfhjsh"
vector<T> v6(n,val); //直接初始化多个重复值
vector<T> v7(n); //创建n个对象,进行值初始化
注意的点:使用圆括号跟花括号时,区分给定的是元素初值还是可容纳元素个数
vector<int> v1(5); //v1.size()==5
vector<int> v2{5}; //v2.size()==1
vector<int> v3(5,1); //v3.size()==5,v3[i]==1
vector<int> v4{5,1}; //v4.size()==2,v4[0]==5,v4[1]==2
5.关联容器的定义及初始化
跟vector等顺序容器不同,关联容器按其关键字进行保存和范围,换句话说,关键字起到了vector等部分顺序容器的下标的作用。
5.1关联数组map的定义
map<string,int> word_count; //有序不重复关联数组
multimap<string,int> word_cout1; //有序可重复类型
unordered_map<string,int> word_count2; //无序不重复
unordered_multimap<string,int> word_count2; //无序可重复
5.2集合set的定义
set<string> se1={“hello”,“world”}; //有序不重复集合
multiset<int> se2; //有序可重复集合
unordered_set<string> se3; //无序不重复集合
unordered_multiset<string> se3; //无序可重复集合