来源于对C++Primer内容的理解或者可以说成个人笔记
长整型34位、带符号
int main()
{
int a{2};
int b{1}, c{2};
int d = {0};
//上述写法等同于
int e= 0;
cout << a << b << c << d << e;
return 0;
}
int main()
{
{
#include
int *m = NULL;
}
int *p = 0;
int *q = nullptr;
//上述三种写法相同
return 0;
}
将变量声明为constexpr以便于有编译器判断变量的值是否是一个常量表达式。
constexpr int fun()
{
return 8;
}
int main()
{
constexpr int a = 10;
constexpr int b = a+1;
constexpr int c = fun();//此处fun()必须为constexpr
return 0;
}
关键字:typedef、using
可以给类型名称起一个外号,例如:
int main()
{
using i = int;
typedef int j;
typedef int k, *p;
int a = 1;
i b = 2;
j c = 3;
k d = 4;
p e = &d;
cout << typeid(a).name() << endl;
cout << typeid(b).name() << endl;
cout << typeid(c).name() << endl;
cout << typeid(d).name() << endl;
cout << endl << "注意这里的p定义的e和其他的有什么不同:"<< endl;
cout << typeid(*e).name() << endl;
cout << typeid(e).name() << endl;
return 0;
}
根据表达式自动分析变量类型。类似于C#中的var
int main()
{
auto a = 1;
auto b = 1.1;
auto c = "asd";
auto d = 'a';
auto e = true;
cout << typeid(a).name() << endl;
cout << typeid(b).name() << endl;
cout << typeid(c).name() << endl;
cout << typeid(d).name() << endl;
cout << typeid(e).name() << endl;
return 0;
}
decltype(变量或方法) a = 0;
eg:
int main()
{
int a = 1;
const int &b = a;
decltype(a) c = 0;//const int
decltype(b) d = b;//cinst int&
//decltype(b) e; 错误写法
cout << typeid(a).name() << endl;
cout << typeid(b).name() << endl;
cout << typeid(c).name() << endl;
cout << typeid(d).name() << endl;
return 0;
}
C++11新标准规定,可以为数据成员提供一个类内初始值
一个修改字符串的例子(包括范围for的用法,修改和遍历)
void print(string str)
{
//循环输出
for (auto i : str)
{
cout << i;
}
cout << endl;
}
int main()
{
string str = "hello world!";
cout << "修改str" << endl;
for(auto &i : str)
{
i = toupper(i);
}
print(str);
return 0;
}
vector<int> a;
vector<int> b = a;
vector<int> c(a);
vector<int> d(3,6);
vector<int> e(3);
vector<int> f{1,2,3,4,5};
vector<int> g = {1,2,3,4,5};
bool isEmpty = f.empty();//判断是否为空
int size = f.size();//返回vector元素数量
不能使用下表添加元素!!!
不能使用下表添加元素!!!
不能使用下表添加元素!!!
正确示例:
int main()
{
vector<int> a;
a.push_back(1);
a.push_back(2);
return 0;
}
begin:返回数组的首个元素的指针
end:返回数组最后一个元素的下一个位置的指针
int main()
{
int a[5] = {1,2,3,4,5};
int *pbeg = begin(a);
int *pend = end(a);
//对pbeg进行姐引用看看是不是第一个元素
cout << *pbeg << endl;
//输出数组最后一个元素地址和pend的地址
cout << pend << " " << &a[4] << endl;
return 0;
}
根据输出结果,输出数组最后一个元素地址和pend的地址进行比较,可以看出pend的地址在最后一个元素之后的下一个位置,即两地址差为4
C++11商一律向0取整
即:5/2 = 2
-6/4 = -1
早期-6/4 = -2
sizeof返回目标所占大小,返回类型是size_t(机器相关的无符号类型,足够大)
sizeof(type)
sizeof expr
eg:
class A
{
public:
int a;
double b;
char c;
};
int main()
{
A a, *p;
cout << sizeof(A) << endl;
cout << sizeof(a)<< endl;
cout << sizeof(p) << endl;
cout << sizeof(*p) << endl;
cout << sizeof(a.b) << endl;
cout << sizeof(A::b)<< endl;
return 0;
}
上述代码中对空指针p进行解引用并没有报错,证明sizeof并没有执行运算对象的值,并通过A::b可以看出,我们使用sizeof也无需使用一个对象
sizeof对vector和string进行返回时,值返回string和vector的固定部分大小。( 圈起来,重点考)
eg:
int main()
{
vector<int> a{1,2,3,4,5};
cout << sizeof(a) << endl;
vector<int> b{2,3,4,5};
cout << sizeof(b) << endl;
return 0;
}
同名头文件
如果一个函数不确定参数的数量 则可用此。
eg:
void print(initializer_list<string> list)
{
for(auto pbeg = list.begin(); pbeg != list.end(); pbeg++)
{
cout << *pbeg;
}
}
int main()
{
string a = "\t\t草\n";
string b = "\t\t\t李白(不许笑,就是我写的,我的草,我草!!!)\n";
string c = "\t离离原上草,\n";
string d = "\t越赚钱越少。\n";
string e = "\t你若喜欢看,\n";
string f = "\t一会点个赞。\n";
print({a});
print({b,c,d,e,f});
return 0;
}
initializer_list的值默认是const,不能改变
vector<int> print()
{
return {1,2,3};
}
int main()
{
for(auto x : print())
{
cout << x << endl;
}
return 0;
}
eg:
//尾置返回类型
auto func(int i) -> int(*)[10];
//decltype
decltype(sth) *arrptr(int i)
{
return **;
}
众所周知,一个类没有显式的写出构造函数,编译器会默认生成一个无参构造函数,反之不会生成,那么我们既需要默认的构造参数,有需要自定义的构造参数可以用如下代码告诉编译器来生成默认的构造参数:
className = default;
除了array外,swap只交换两个容器的内部结构,指针,引用,迭代器所绑定的元素不会改变。
eg:swap(vector1, vector2)
调用insert和puh都是将元素类型的对象传递给他们,这些对象被拷贝到容器中。
emplace是直接将参数传递给元素类型的构造函数,emplace使用这些参数直接在容器管理的内存中构造元素
eg:
class A
{
public:
int a;
A(int a)
{
a = a;
}
};
int main()
{
vector<A> c;
c.push_back(A(1));
c.emplace_back(1);
return 0;
}
C++11标准中,可以调用shrink_to_fit要求deque,vector或string退回不需要的内存空间。但是具体的实现可以选择性忽略此语句。也就是说不一定会退回空间。