读C++Primer的一点发现

看完教学视频后去读了一下C++Primer,发现了很多细节上的问题:



1.标识符不能包含两个连续的下划线__,也不能以下划线开头后面紧跟一个大写字母

在函数体外定义的标识符不能以下划线开头

int __a = 1;
cout << a << endl;

//错误1error C2065: “a”: 未声明的标识符d:documentsvisual studio 2013projects实验探究实验探究源.cpp91实验探究


2.内置类型变量的初始化

如果没有手动的初始化的话,在函数体外定义的变量编译器会自动初始化为0

函数体内的则不自动初始化

#include
#include

using namespace std;

int a;

int main()
{
	//int __a = 1;
	int b;
	
	cout << a << endl;
	cout << b << endl;
	getchar();
	return 0;
}empty

3.unsigned   signed
当赋值大于两者的取值范围时对于unsigned编译器会对保存的数对类型大小进行求模,对类型赋值(特别是负值,对unsigned一般负值都是求模储存//如-1的unsigned int为-255
对于signed类型编译器不同行为也不同,但一般也是求模储存

4.const类型默认为文件的局部变量,如果要在别的文件中使用需要加extern,非const变量默认为extern

5.const 引用可以初始化为不同类型的对象,或者为右值,非const类型的引用不可以
double i = 4.20;
int j = 1;

const int &k = i;//ok
这里是因为将double类型的变量给int类型的引用的时候会发生
././int tmp = 4;
//const int &k = tmp;
从而不能通过引用指向它原来的值
int &n = i;//err
const int &m = 1;//ok
int &n = 1;//err

6.enum的成员是常量表达式//这个东西我是真的没用过

默认他的第一个枚举成员赋值为0,后面的每个成员会比前面的大一

7.vector 如果没有指定初始化方式,标准库将自动的提供一个元素初始值进行初始化

1)< >中为内置类型将用0初始化

2)< >中为含有构造函数的类,则使用默认构造函数进行初始化

3)< >中为不含构造函数的类-仍将产生一个带初始值的对象,但不知道是啥


8.c++在for循环是判断条件一般优先考虑 !=号//这个也不知道为什么,等以后知道了在说吧


9.while (cin>>i)  while(cout<<i<<j)

这种在c++中是支持的,因为cin和cout在定义中重载了()

如果你把一个basic_ios类的对象(cin就是)放到if语句的括号里,它就会被转换成void*型。如果输入失败的话,就会得到一个空指针(也就是0),那么if语句就不能通过。

operator void*() const
{ return this->fail() ? 0 : const_cast<basic_ios*>(this); }
//上述代码来自网上


10.vector <int>::iterator mid = (d.begin() + d.end()) / 2;这个是不行


11.goto语句和switch case语句中跳过变量的定义部分参生的问题及解决

变量var(_variant_t)的定义在goto之后,在跳转到的语句块之前被声明,因此编译器就会出现编译错误。

   小结:
      1. 使用goto语句时对POD对象进行操作时,该在goto使用之前进行定义,
         避免在goto语句和跳转程序块之间声明该语句或者{...}引用起来

      2. switch-case语句而言,应该将各个Case语句用{...}引用起来,使其形成一个独立的程序模块


12.没有显示提供初值的数组会和普通元素一样初始化

     1)在函数体外定义的内置类型数组,其元素皆初始化为0

     2)在函数体内定义的内置类型数组,其元素皆不初始化

     3)不管数组在哪里定义,如果其元素为类类型,则自动地调用该类的默认构造函数进行初始化;如果该类没有默认构造函数,则必须为该数组的元素提供显示的初始化


13.对指针进行初始化或赋值

     如果初始化或者赋值为0值常量表达式

     1)0的整形const对象

     2)字面值常量0

     int ival;

     int zeor = 0;

     const int c_ival = 0;

     int *pi = ival;  //err

     pi = zeor;   //err

     pi = c_ival;   //ok

     pi = 0;   //ok


14.指针和typedef

     下面是一个几乎所有人刚开始接触指针都会犯的错误

     typedef string *pstring;

     const pstring cstr;

     请问cstr是什么类型?

     const string *str;  //err

     string *const str;  //

     pstring 是一个货真价实的指针,所以const修饰的是一个指针


15.const 放在类型前面和后面没有任何区别

     string const *str;

     const string *str;


16.在 IBM PC及其兼容机中,以Ctrl + Z表示文件结束符。在UNIX和Macintosh系统中,以 Ctrl + D表示文件结束符。


17.    int getchar(void);

【参数】该函数没有参数。

【返回值】函数的返回值为用户输入的第一个字符的ASCII码,若出错返回-1,且将用户输入的字符回显到屏幕。如果用户在按回车键之前输入了不只一个字符,其他字符会保留在键盘缓冲区中,等待后续getchar()调用读取。也就是说,后续的getchat()调用不会等待用户按键,而是直接读取缓冲区中的字符,直到缓冲区的字符读取完毕后,才等待用户按键。


18.C++对ends的处理时一样的,都是在缓冲区插入''然后刷新,之所以在不同的系统下的显示情况不同是因    为,windows和linux对''的处理方式不同,在windows中会输出一个空格,而linux下则不会有什么输出。


19.操作符重载

= [] -> ()不能使用友元重载是因为他们在类中已经被默认的赋予了相应的功能

例如 = 操作符 Base A = 1;

相当于调用了  A(1); 如果再在类的外部重载了 = 操作符,编译器将不知道调用哪个,所以直接不允许这样做

其他的3个操作符也是这样的原因


20.const 的对象只能调用const的成员函数,int max() const;

const 对象只能调用常函数的原因是因为类的成员函数都有一个隐藏的this指针,而常成员函数的this指针是const类型的  int max (const 类名 *this) const;

const对象的this指针为const类型的所以只能调用const成员函数,而非const对象也可以调用常成员函数

原文地址:https://www.cnblogs.com/wei1/p/9582138.html