C++ primer笔记1

1、初始化:初始化指创建变量并给它赋值初值,赋值则是擦除对象当前值并用新的值代替。

2、内置类型变量的初始化:在函数外定义的变量都初始化为0,在函数体里定义的内置类型变量不进行自动初始化。

3、建议每个内置类型的对象都要初始化。虽然不是必须的,但是会更加容易和安全。

4、类类型变量的初始化:类通过定义一个或多个构造函数来控制类对象的的初始化。

5、声明和定义:变量的定义用于为变量分配存储空间,还可以为变量指定初始值。声明用于向程序表明变量的类型和名字。定义也是声明:当定义变量时我们声明了他的类型和名字。

6、变量在使用前必须先声明或定义。

7、在全局作用域声明的const变量是定义该对象的文件的局部变量。此变量只存在于那个文件中,不能被其他文件访问。const对象必须初始化,且其值不能被修改。

8、引用就是对象的另一个名字。在实际程序中主要用作函数的形式参数。作用在引用上的所有操作事实上都是作用在该引用绑定的对象上。

9、const引用是指向const对象的引用。非const引用只能绑定到与该引用相同类型的对象。

10、typedef 名字:typedef 通常被用于以下三种目的

      ①为了隐藏特定类型的实现,强调使用类型的目的

      ②简化复杂的类型定义,使其容易理解

      ③允许一种类型用于多个目的,同时使得每次使用该类型的目的明确

11、class和struct关键字定义类的唯一差别在于默认访问级别:默认情况下,struct的成员为public,而class的成员为private。

12、头文件中应该只定义确定必要的东西。

13、两个字符串字面值相加是非法的。

14、cctype定义的函数:

C++ primer笔记1_第1张图片

15、vector对象的初始化方式:

①vector v1;       //vector保存类型为T的对象。默认构造函数,v1为空

②vector v2(v1);  //v2为v1的一个副本

③vector v3(n,i);  //v3含有n个值为i的元素

④vector v4(n);    //v4含有值初始化的元素的n个副本

16、vector必须是已存在的元素才能用下标操作符进行索引。通过下标操作进行赋值时,不会添加任何元素。

17、每种容器都定义了一对命名为begin和end的函数,用于返回迭代器。

18、解引用操作符(*操作符):解引用操作符返回当前指向的元素。

19、标准库bitset类型:初始化bitset方法如下:

①bitset b;     //b有n位,每位都是0

②bitset b(u);  //b是unsigned long型u的一个副本

③bitset b(s);   //b是string对象中含有的位串的副本

④bitset b(s,pos,n);  //b是s中从位置pos开始的n个位的副本

20、当用unsigned long值作为bitset对象的初始值时,该值将转化为二进制的位模式。当用string对象初始化bitset对象时,string对象直接表示为位模式。从string对象读入位集的顺序是从右到左

string val("1100");bitset<32> bitval(val);     //第二三位是1,其余位都是0

21、除了程序员自己注意细节,并彻底测试自己的程序之外,没有别的方式可防止数组越界。

22、尽量避免使用指针和数组。vector和迭代器一般取代了数组和指针,string取代了C风格的字符串。

23、由于指针的类型用于确定指针所指对象的类型,因此初始化或赋值时必须保证类型匹配。

24、void* 可以保存任何类型对象的地址。

25、指针赋值和通过指针进行赋值两种操作的区分方法:如果如果对左操作数进行解引用,则修改的是指针所指向的对象的值;如果没有使用解引用操作,则修改的是指针本身的值。

    string s1("some value");
    string *sp1 = &s1;
    string s2("another");
    string *sp2 = &s2;

    *sp1 = "a new value";         //*sp1 = "a new value"
    sp1 = sp2;                          //*sp1 = "another"

26、两个指针减法操作结果是标准库类型ptrdiff_t的数据。

27、C++允许计算数组或对象的超出末端的地址,但不允许对地址进行解引用操作。而计算数组超出末端位置之后或数组首地址之前的地址都是不合法的。

28、定义const对象必须初始化。

29、C语言风格字符串是以空字符null结束的字符数组。在处理C风格字符串的标准库函数时,牢记字符串必须以结束符null结束。

char cal1[]={'C','+','+'};   //not null

char cal2[]={'C','+','+','\0'};   //null   是C语言风格

char cal3[]="C++";     //null 是C语言风格

const char *cp="C++"; //null 是C语言风格

30、C风格字符串的标准库函数,头文件#include

一般有如下函数:strlen(s)返回字符串的长度,不包括结束符、strcmp(s1,s2) 字符串相等返回0、strcat(s1,s2)将s2连接到s1、

strcpy(s1,s2)将s2复制给s1、strncat(s1,s2,n)将s2的前n个字符连接到s1、strncpy(s1,s2,n)将s2的前n个字符复制到s1

31、混合使用C风格和string风格字符串:

    string str = "C++";
    const char *str1 = str.c_str();
    cout << str1 << endl;            //输出 C++

32、数组初始化vector:

    const int array_size = 5;
    int int_arr[array_size] = {1,2,3,4,5};
    vector ivec(int_arr, int_arr + array_size);

33、将第27位置1,    bitset_quiz.set(27);  int_quiz |= 1UL << 27;

        将第27位置0,   bitset_quiz.reset(27);  int_quiz &= ~(1UL << 27);

        查看第27位状态, bool status; status = bitset_quiz[27]; int_quiz&(1UL<<27);

34、在赋值操作上加圆括号是必需的,因为赋值操作符的优先级低于不等操作符。

35、值初始化的()语法必须置于类型名后面,而不是变量后。

    int *pi = new int();   //*pi=0
    int x(); //没有起到初始化作用,程序报错

36、动态内存的管理容易出错

(1)删除指向动态内存的的指针失败,造成“内存泄漏”。一般很难发现,只有消耗尽内存,内存泄漏才会真正显露出来。

(2)读写已删除的对象。如果删除指针所指向的对象之后,将指针置为0值,则比较容易检测出这类错误。

(3)对一个内容空间使用两次delete表达式。

37、静态全局变量与全局变量的唯一区别就是作用域不同。

全局变量

  • 作用域:全局作用域(全局变量只需在一个源文件中定义,就可以作用于所有的源文件。)
  • 生命周期:程序运行期一直存在
  • 引用方法:其他文件中要使用必须用extern 关键字声明要引用的全局变量。
  • 内存分布:全局数据区
  • 注意:如果在两个文件中都定义了相同名字的全局变量,连接出错:变量重定义

全局静态变量

  •  作用域:文件作用域(只在被定义的文件中可见。)
  • 生命周期:程序运行期一直存在
  • 内存分布:全局数据区
  • 定义方法:static关键字,const 关键字
  • 注意:只要文件不互相包含,在两个不同的文件中是可以定义完全相同的两个静态变量的,它们是两个完全不同的变量

静态局部变量

  • 作用域:局部作用域(只在局部作用域中可见)
  • 生命周期:程序运行期一直存在
  • 内存分布:全局数据区
  • 定义方法:局部作用域用中用static定义
  • 注意:只被初始化一次,多线程中需加锁保护

局部变量

  • 作用域:局部作用域(只在局部作用域中可见)
  • 生命周期:程序运行出局部作用域即被销毁
  • 内存分布:栈区
  • 注意:auto指示符标示

Tips:

  • 若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度;
  • 若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度;
  • 设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题,因为他们都放在静态数据存储区,全局可见;
  • 如果我们需要一个可重入的函数,那么,我们一定要避免函数中使用static变量(这样的函数被称为:带“内部存储器”功能的的函数)
  • 函数中必须要使用static变量情况:比如当某函数的返回值为指针类型时,则必须是static的局部变量的地址作为返回值,若为auto类型,则返回为错指针。 

你可能感兴趣的:(C++Primer)