1.避免数据的复制
int v[]{12, 13, 14, 15}
for(auto x : v)
{
cout << x << endl;
}
相当于把v里每个元素都复制到x中
那怎么修改呢
for(auto &x : v)只用修改成这样,用引用的方式,就可以避免数据的复制
一般说,一个容器只要内部支持begin和end成员函数用于返回一个迭代器,能够指向容器的第一个元素和末端元素的后面,这个容器就可以支持范围for语句
2.C和C++的内存分配
前者3个,后者5个
3.malloc
malloc一般形式是
void * malloc(int NumBytes)
看下面范例
int * p = NULL;
p = (int *)malloc(10 * sizeof(int));
if(p != NULL)
{
*p = 5; //其实只用到了申请40字节的4个字节
cout << *p <
free§;
}
new/delete比malloc/free做了更多的工作,所以在C++中用new和delete
4.指针的初始化
对于指针的初始化,能用nullptr的全部用nullptr
cout << typeid(NULL).name() << endl; //int
cout << typeid(nullptr).name() << endl; //std::nullptr_t
5.struct
struct student { private: int number; void func() { number++; } } student stu1; stu1.number = 1001 //不可以引用 //不可以通过对象名引用结构或类的成员,否则编译时报错 //但是在成员函数func中还是可以直接引用number的,因为成员函数可以直接访问成员变量而不管成员变量是否为private
结构体中默认是public,类中则是private,他们的继承也是
6.C++中更习惯使用引用类型的形参来取代指针类型的形参
7.函数重载
void func1(const int i){}
void func(int i) {}
这样的重载不可以,因为const关键词在比较同名函数时会被忽略,这两个函数相当于参数类型和数量完全一样,所以函数重载不成立,编译链接时会报错
8.函数形参中带const
void func(const student &stu)
{
stu.num = 1010//这就是错误的,不能修改stu的内容
}
void func(cosnt int i) //实参可以是正常的int,形参可以用const int接,这没问题
{
int i = 100; //这也不行,不能给常量赋值
}
把形参写成const的好处
1.可以防止无意中修改了形参值导致实参值被无意中修改掉
2.实参类型可以更加灵活
就像上面那个,实参可以是正常的int,形参可以用const int接,这没问题
形参可以接受多样化的实参类型
在看void func2(int &a){}
func2(123)这是不可以的,必须传递进去一个变量
但是void func2(const int &a){}
func2(123)这样就没问题了,可以传递进去一个常量了