1.int month=09编译错误?
解释: 0开头表示八进制 0x表示十六进制
测试代码:
#include<iostream>
using namespace std;
void main()
{
int month =9,day=7;
int month1 =06,day1=017;
cout << month << " "<< day1<<endl;
}
测试结果:
2.枚举成员是常量,不能改变枚举成员的值;每个enum都定义了一种新的类型;枚举类型的对象的初始化或赋值,只能通过其枚举成员或同一枚举类型的其他对象进行。
//point2d is 2,point2w is 3,point3d is 3,point3w is 4
enum Points{point2d=2,point2w,point3d=3,point3w};
Points pt3d = point3d;//ok
Points pt2w=3;//error
pt2w=pt3d;//ok
3.在全局作用域中定义非const变量时,它在整个程序中都可以访问。
//file_1.cpp
int counter;//definition
//file_2.cpp
extern int counter;//use counter from file_1.cpp
++counter;
与其他变量不同,除非特别说明,在全局作用域声明的const变量是定义该对象的文件的局部变量。此变量只存在于那个文件中,不能被其他文件访问。
//file_1.cpp
//defines and initializes a const that is accessible to other files
extern const int bufSize=24;
//file_2.cpp
extern int bufSize;//use bufSize from file_1
4.当const 常量使用常量表达式初始化时, 大部分编译器直接用对应的常量表达式来代替这个const变量的任何使用。所以实践中不会有任何存储空间用于常量表达式初始化的const变量。
5.string::size_type类型string类类型和许多其他库类型都定义了一些配套类型,以此使得库类型的使用和机器无关(machine-independent)。它定义为与unsigned型具有相同的含义,而且能够保证足够大能够存储任意string对象的长度。 (int变量和机器有关)
#include<iostream>
#include<string>
using namespace std;
void main()
{
string str("some string");
//int size=str.size ();
for(string::size_type ix=0;ix!=str.size();++ix)
cout << str[ix]<<endl;
}
如果把size()的返回值赋值给int变量会有warning。
6.指针和typedef
string s;
typedef string *pstring;
const pstring cstr1=&s;//written this way is obscure
pstring const cstr2=&s;//all three decreations are the same type
string *const cstr3=&s;// they are all const pointers to string
声明const pstring时,const修饰的是pstring类型,这是一个指针。因此,该声明语句应是把cstr1定义为指向string类型对象的const指针。
指向const对象的指针 (不允许指针修改所指const的值,c++强制要求指向const对象的指针也必须具有const特性,必须使用const void*保存)
const double pi=3.14;
double *ptr=π //error:ptr is a plain pointer
const double *cptr=&pi //ok:cptr is a pointer to const
const指针(本身的值不能变)
int errNum=0;
int *const curErr=&errNum;
7.Never forget null
在使用处理C风格字符串的标准库函数时,牢记字符串必须以结束符NULL结束。否则结果补课预料!
8.类背后蕴含的基本思想是数据抽象和封装。
数据抽象是一种依赖于接口和实现分离的编程(和设计)技术。类设计者必须关心类是如何实现的,但使用该类的程序员不必了解实现的细节。
封装是一项将低层次的元素组合起来形成新的、高层次实体的技术。(类和对象都是封装的实体)
9.数据抽象和封装的优点:
(1)避免内部出现无意的、可能破坏对象状态的用户级错误。
(2)随时间推移可以根据需求改变或缺陷(bug)报告来完善类的实现,而无需改变用户级代码。
10.只有当类定义在前面出现过,数据成员才能指定为该类类型。如果该类型是不完全类型(声明一个类而不定义),那么数据成员只能是指向该类类型的指针或引用。(static除外)
class LinkScreen{
Screen window;
LinkScreen *next;
LinkScreen *prev;
};
11.为什么类的定义以分号结束?
分号是必需的,因为在类定义之后可以接一个对象定义列表。
class Sales_item{/*...*/};
class Sales_item{/*...*/} accum,trans;
12.可变数据成员(mutable)
可变数据成员永远都不能为const,甚至但它是const对象的成员也是如此。因此,const成员函数可以改变mutable成员。
mutable size_t access_str;//may change in a const member
13.构造函数初始化列表
有些成员必须在构造函数初始化列表中进行初始化。对于这样的成员,在构造函数函数体中对他们进行赋值不起作用。没有默认构造函数的类类型成员,以及const或引用类型的成员,不管是哪种类型,都必须在构造函数初始化列表中进行初始化。
14.抑制由构造函数定义的隐式转换(explicit)
可以用单个实参来调用的构造函数定义了从形参类型到该类类型的一个隐式转换。
string null_book = "9-999-9999";
//isbn equal to null_book
item.same_isbn(null_book);
利用null_book新建一个临时对象传递。