Bootstrap

c++ primer笔记1

#include
#include//vector类模板 编译器根据模板创建函数或者类的过程叫做实例化 实例化的过程:在尖括号内放入更多信息
#include<stdio.h>
#include<string.h>
#include
using namespace std;
int main()
{
vector vec(10,0);//创建指定对象元素
vector p1(vec);//拷贝
vector p2 = p1;//拷贝
vector p3(10);//自动初始化,尖括号内的类型为类,采用构造函数初始化
vector p4{ 1,2,34 };//列表初始化
vector p5 = { 1,2,43 };//列表初始化
//圆括号用来构造vector对象,花括好用来列表初始化
vec.push_back(10);//向尾端压入元素,速度快
vec.empty();
vec.size();//类型为vector::size_type
vec[1]=1;//不可以用下表添加元素,因为有的元素个数没有达到,除非先初始化

p4 = p5;//将p5中的元素拷贝喜欢p4中的元素
p4 = { 1,2,3,4 };//用列表中的元素拷贝替换p4中的元素;
p4 == p5;//只有类型一致,元素个数一样,且对应位置相同才可以判断相等
p4 != p5;// < <= > >=一样
auto x = p1.begin(), y = p1.end();//end为尾后迭代器,前闭后开区间
*x;
//如果vector包含类型为类,则可以用x->memberhuoz(*x).member
++x, --x;
x == y, x != y;//只有同一个容器的迭代器且指向的元素一样


//迭代器类型包括iterator和const_iterator
//iterator可以读写元素,const_iterator只能读元素
vector<int>::iterator it1;
string::iterator it2;
vector<int>::const_iterator it3;
auto it4 = p1.cend();//auto为vector<int>::const_iterator

x + 4;
x - 2;
x += 1;
x -=2;
y - x;//迭代器距离
auto p = p1.begin();
auto mid = p1.begin() + p1.size() / 2;//计算得到一个最接近p1中间位置的元素
if (p < mid) { ; }//前半部分元素
auto beg = p1.begin(), end = p1.end();
auto mid = beg + (end - beg) / 2;//初始状态下的中间点迭代器

//数组不可以拷贝  a2=a1;//a1,a2为数组就错误
//数组元素的下标为size_t   
unsigned int x1 = 1;
constexpr unsigned x2 = 1;
int a[] = { 1,2,3 };
a[x2];//如果为x1则不正确,下标必须为常量表达式。
int iam[] = { 1,2,3,4 };
auto last =iam+3;
auto xxx = *last;
int* pm = &iam[1];
int xsd = *(iam - 1);

char m1[] = "sjjs";
char m2[] = "sjsj";
cout << strcmp(m1, m2) << endl;

int  len = strlen(m1);//6
cout << len << endl;
string s1 = "skks";
auto p = s1.length();
auto ksks = strlen(s1.c_str());
int as[3][4];

//左值和右值
/*
左值可以用于赋值语句的左侧,右值不可以
当一个对象被用作右值的时候,用的是对象的值(内容);当一个对象被用作左值的时候,用的是对象的身份(在内存中的位置)
左值可以当右值用,反之不可以
赋值运算符=,需要用一个非常量的左值作为运算符的左侧对象,得到的也是一个对象
取址运算符&作用在左值运算对象上,返回一个指向该运算对象的指针,这个指针是右值
内置的解引用运算符*,下标运算符[],迭代器的解引用运算符*,string和vectotr的下标运算符得到的都是一个左值
*/

int* p;
decltype(p);//结果为int &
decltype(&p);//结果为int **

//位运算符:作用于整数类型的运算对象,并把运算对象看成二进制位的集合
/*
~expr 位求反 1->0  0->1
expr1<<expr2 左移  exp2>0  超过部分省略
expr1>>expr2 右移  exp2>0  超过部分省略
expr&expr  位与    全1为1,否则为0
expr|expr 位或     有1为1,全0为0
expr^expr 位异或   相同为0,否则为1
*/


//sizeof()的返回值为常量表达式

/*类型转换
* 两种类型可以相互转换,说明他们是关联的,比如int和double
* 
* 
* 隐式类型转换
* 不需要程序员介入的转换叫隐式转换  int  a=3.14+1;过程:1先转化为浮点型(隐式转换设计的避免损失精度)
然后浮点型转换为int型(为了完成初始化)
* 条件表达式中,非bool转化为bool
* 初始化中,初始化值转化为变量值
* 赋值表达式中,右侧值转换为左侧运算对象的类型
* 函数调用也会发生类型转换
* 整型提升:char,short,unsigned short,signed char,bool所有的值都可能存在于int中,会向int转换
* 数组名会转化为首地址
* 
* 指针的类型转换:常量整数值或者字面值nullptr可以转化为任意类型的指针
* 指向非常量的指针可以转化为void *
* 指向任意对象的指针可以转化为const void*
* 在条件运算符中,只要指针不是nullptr(空),转化为true,否则就是false  nullptr->false
* 
* 
* 转化为常量:运行将非常量类型的指针转化为相应的常量类型转换,引用也是一样,不可以用常量指针或者引用转换为非常量引用或者非常理指针
* 
* while(cin>>s)也是类型转换,读入成功为真
* 
*显示类型转换
* 强制类型转换
* int i,j;double p=i/j;
* 
*type(expr) 函数形式的强制类型转换
* (type)expr c风格的强制类型转换 (double)2
* 
* ::     全局作用域::name  类作用域class::name   命名空间作用域namespace::name
*/

;

return 0;

}

;