1.关于C++Primer的学习资料我已经上传到论坛资源上了
附上链接:1.C++Primer书上的源代码 点击打开链接
2.C++primer书籍 点击打开链接
3.C++primer课后答案 点击打开链接
2.第二章知识点
1.基本内置类型:
-
- 整型(int ,short, long ),unsigned(int ,short, long )
- 浮点型(float , double , long double),unsigned(float , double , long double)
- 字符型(char , wchar_t),unsigned(char , wchar_t)
- 布尔型(bool)
- 整型(int ,short, long ),unsigned(int ,short, long )
- 浮点型(float , double , long double),unsigned(float , double , long double)
- 字符型(char , wchar_t),unsigned(char , wchar_t)
- 布尔型(bool)
注意:1.不同的机子基本内置类型在内存中占有的字节数是不同的可以自己测试一下,用C语言的函数sizeof(数据类型);eg: std::cout<< sizeof(int);
2.对于不同类型变量赋值时的越界问题 例如:对于unsigned char型取值范围是(0-255),如果赋值为-1时,结果为255(对256取模的结果)
2.常量:
注意: 1.对于例子std::cout<<"abc" L"abc"<<std::endl;字符串常量与宽字符串常量连接输出时结果是不确定的,因为连接不同类型的行为标准没有定义。
3.变量:
1.含义:
变量提供了程序可以操作的有名字的存储区 ,类型决定了变量的内存大小和布局、能够存储于该内存中的值的取值范围以及可应用在该变量上的操作集
2.变量初始化:
直接初始化 eg: int a(1024); 复制初始化 eg: int a = 1024; 注意初始化不是赋值,初始化指创建变量并给它赋初始值,而赋值则是擦除对象的当前值并用新值替代
3.变量初始化规则:
内置数据类型变量:在函数体外定义的变量自动初始化为0,函数体内部定义的不会自动初始化
类类型的对象:类类型定义一个对象时由他的构造函数初始化(当定义一个对象时系统会调用构造函数),我们可以自己定义构造函数来初始化,或者由默认构造函数初始化。
4.变量的声明和定义(重点):
变量的定义用于为变量分配存储空间,还可以为变量指定初始值。在一个程序中,变量有且仅有一个定义。
声明用于向程序表明变量的类型和名字。变量可以有多个声明。
定义也是声明:当定义变量时我们声明了它的类型和名字。可以通过使用extern 关键字声明变量名而不定义它。例如
extern int i;//声明变量 int i; //定义变量 extern int i = 5;//定义变量(只有extern声明在函数体外部,才可以初始化)
5.变量作用域:
局部变量作用域高于全局变量 ,例如
#include <iostream> int sum = 0; int main() { int sum = 2; std::cout<<"sum = "<<sum; } //输出结果是2
4.const 修饰符(重点):
1.注意:
const将变量转成常量,因为定义常量后不能进行赋值,所以需要初始化。
2.const 对象默认为文件的局部变量,解释:
//对于全局变量在文件file1.cpp中 int number = 10;//定义了number的值 //在文件file2.cpp中 #include<iostream> extern int number;//声明了number在其他文件定义过了 int main() { std::cout<<number<<std::endl; } //可以输出number的值 //对于const修饰的变量在文件file1.cpp中 const int number = 10; //定义了number常量的值 //在文件file2.cpp中 #include<iostream> extern const int number; //声明了number在其他文件定义过了 int main() { std::cout<<number<<std::endl; } //报错,不能输出number的值,因为const 对象默认为文件的局部变量,其他文件没法访问局部变量 //如何在其他文件中访问const修饰的变量呢? //将file1.cpp中改为 extern const int number = 10;就可以了
5.引用:变量的别名(&)
1.注意:
引用是一种复合类型(用其他类型定义的类型),不能定义引用类型的引用,可以定义其他类型的引用。
引用必须用与该引用同类型的对象初始化,例如:int ival = 1024; int &refVal = ival; //正确,refVal是对ival的引用 int &refVal2; //错误,没有初始化 int &refVal3 = 10;//错误,初始化必须是对象(变量)
2.const 引用与非const引用区别
const 引用可以初始化为不同类型的对象或者初始化为右值,非 const 引用只能绑定到与该引用同类型的对象(上面程序已经说明了),const 引用则可以绑定到不同但相关的类型的对象或绑定到右值。解释:
//绑定到右值 const int &r = 42;//正确,42是int 型常量,const 引用 r 相当于int 型常量,去掉const 报错,因为42是常量,不是对象(变量) //绑定不同的类型 double dval = 3.14; const int &ri = dval;//正确,去掉const 报错,因为dval是double型的,ri是int 型的,引用不是同类型
6.typedef 关键字
typedef 用来定义类型的同义词。例如:typedef unsigned char u_char;//以后可以用u_char代替unsigned char。
7.枚举enum关键字
1.枚举成员是常量:可以为一个或多个枚举成员提供初始值,后面的枚举成员在初试值上一次加1,用来初始化枚举成员的值必须是一个常量表达式。例如:
enum Points { point2d = 2, point2w,point3d = 3, point3w };//point2d显示初始化为2,point2w隐式初始化为3,point3d显示初试化为3,point3w隐式初始化为4
2.每个enum都定义唯一的类型:枚举类型的对象的初始化或赋值,只能通过其枚举成员或同一枚举类型的其他对象来进行
Points pt3d = point3d; //正确 Points pt2w = 3; // 错误,3是int型的常量,pt2w是Points型 pt2w = pt3d; // 正确
8.类类型
1.定义类:
class man()//类里默认为private { public: //实际中一般用来放成员函数 private: //实际中一般用来放数据成员 };
2.定义变量和定义数据成员存在非常重要的区别:
一般不能把类成员的初始化作为其定义的一部分。当定义数据成员时,只能指定该数据成员的名字和类型。类不是在类定义里定义数据成员时初始化数据成员,而是通过称为构造函数的特殊成员函数控制初始化。
3.结构体与类的区别:
用 class 和 struct 关键字定义类的唯一差别在于默认访问级别:默认情况下,struct 的成员为 public,而 class 的成员为 private。
9.头文件(重要):
1.设计头文件:
头文件一般包含类的定义、extern 变量的声明和函数的声明。头文件用于声明而不是用于定义。解释:因为我们在使用这些类,变量,函数实体的时候需要包含这些头文件,如果在头文件中已经定义的话,当我们有几个源文件都用到的情况时,编译会出现重复定义的情况。
2.三个例外情况:头文件可以定义类、inline 函数和在编译时就已知道的 const 对象,前两个我也不太清楚原因
如果 const 变量不是用常量表达式初始化,那么它就不应该在头文件中定义。相反,和其他的变量一样,该 const 变量应该在一个源文件中定义并初始化。应在头文件中为它添加 extern 声明,以使其能被多个文件共享。
3.避免多重包含的方法和原因
#ifndef SALESITEM_H #define SALESITEM_H //含义:1.#ifndef判断SALESITEM_H有没有定义,没有定义往下执行用#define定义一直到执行到#endif //原因:2.在程序中一个源文件用到a.h,b.h另一个源文件中用到a.h,c.h如果不加这些避免多重包含的语句会造成a.h被包含了两次,所以为了避免这种情况我们 //需要在头文件中加入这些判断。 //方法:3.可以借用QT里面的方法,直接用建立的头文件名作为判断名称。比如在建立以个头文件mytest.h文件时,可以加入 // #ifndef MYTEST_H // #define MYTEST_H // // #endif #endif