C++基础知识点

1、非const变量默认为extern。要使const变量能够在其他文件中访问,必须显示地指定它为extern。

2、非const引用只能绑定到与该引用同类型的对象。const引用则可以绑定到不同但相关的类型的对象或绑定到右值。

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

4、头文件一般包含类的定义、extern变量的声明和函数的声明。因为头文件包含在多个源文件中,所以不应该含有变量或函数的定义。对于头文件不应该含有定义这一规则,有3个例外。头文件可以定义类、值在编译时就已经知道的const对象和inline函数。这些实体可在多个源文件中定义,只要每个源文件中的定义是相同的。

5、当我们在头文件中定义了const变量后,每个包含该头文件的源文件都有了自己的const变量,其名称和值都一样。当该const变量是用常量表达式初始化时,可以保证所有的变量都有相同的值。但是在实践中,大部分的编译器在编译时都会用相应的常量表达式来替换对这些const变量的使用。所以,在实践中不会有任何存储空间用于存储用变量表达式初始化的const变量。如果const变量不是用常量表达式初始化,那么它就不应该在头文件中定义。相反,和其他变量一样,该const变量应该在一个源文件中定义并初始化。应在头文件中为它添加extern声明,以使其能被多个文件共享。

6、我们经常要对string对象中的单个字符进行处理,例如,通常需要知道某个特殊字符是否为空白字符、字母或数字,这些函数都在cctype头文件中定义。

string s("Hello World!!!");
string::size_type punct_cnt = 0;
// count number of punctuation characters in s
for (string::size_type index = 0; index != s.size(); ++index)
    if (ispunct(s[index]))
        ++punct_cnt;
cout << punct_cnt
     << " punctuation characters in " << s << endl;
// result: 3 puctuation characters in Hello World!!!
 

7、vector不是一种数据类型,而只是一个类模板,可用来定义任意多种数据类型。vector类型的每一种都制定了其保存元素的类型。因此,vector;和vector都是数据类型。

8、虽然可以对给定元素个数的vector对象预先分配内存,但更有效的方法是先初始化一个空vector对象,然后再动态地增加元素。

9、安全的泛型编程:vector的下标操作,调用size成员函数而不保存它返回的值,在这个例子中不是必需的,但这反映了一种良好的编程习惯。在C++中,有些数据结构(如vector)可以动态增长。如果容器增加了新的元素,那么测试已保存的size值作为循环的结束条件就会有问题。像size这样的小库函数几乎都定义为内联函数,所以每次循环过程中调用它的运行时代价是比较小的。

// reset th elements in the vector to zero
for (vector<int>::size_type ix = 0; ix != ivec.size(); ++ix)
    ivec[ix] = 0;
 

 

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

11、指针和typedef

typedef string *pstring;
const pstring cstr; // ctr is a const pointer to string, equivalent: string *const cstr;
  

12、初始化动态分配的数组
可以使用数组长度后面的一对空圆括号,对数组元素做值初始化

int *pia  = new int[10];   // array of 10 uninitialized ints
int *pia2 = new int[10](); // array of 10 initialized ints
  

13、c_str返回的数组并不保证一定是有效的,接下来对st2的操作有可能会改变st2的值,使刚才返回的数组失效。如果程序需要持续访问该数据,则应该复制c_str函数返回的数组。

const char *str = st2.c_str();
 

14、

/**
 * 加法运算,无论是有符号还是无符号,对应的都是addl指令;
 * 减法运算,对应的都是subl指令;
 * 乘法运算,对应的都是imul指令;
 * 有符号除法运算对应的是idiv指令,无符号除法对应的则是 div指令;
 * 有符号数取模运算会用到idiv指令,无符号取模用的则是div指令.
 * 涉及到不同符号数的混合计算,在计算之前需要先对操作数进行规整化的动作,
 * 规整的原则就是如果操作数中存在至少一个无符号数,则所有操作数都被转化为无符号数,
 * 运算操作也采用相应的无符号操作符进行,计算完的结果也是一个无符号数。
 */
int a = -1;
unsigned int b = 2;
a / b;

15、IO对象不可复制或赋值

只有支持复制的元素类型可以存储在vector或其他容器类型里,由于流对象不能复制,因此不能存储在vector(或其他)容器中(即不存在存储流对象的vector或其他容器)。形参或返回类型也不能为流类型。如果需要传递或返回IO对象,则必须传递或返回指向该对象的指针或引用。

16、待续。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值