201310总结
培训部分 :
char 8个比特位 1字节
short 16个比特位 2字节
long int 32个比特位 4字节
在32位机器上int为long int
float 和long int一样
double 8字节
long long int 8字节
long double 12字节
bool类型需要外部载入 stdbool.h
补码
计算机内都是存储的补码
正数的补码等于其本身
负数的补码=1 0000 0000 -正数的补码
因为要借位,所以1 0000 0000-1
负数补码=正数补码求反+1
正数补码=负数补码-1 求反
八进制是三个二进制位打包
十六进制是四个二进制位打包
合成操作符的优先级很低
scanf清除错误的输入
scanf("%[^\n]");
scanf("%*c");
scanf里面如果有\n 会在回车之后继续读取
异或 ^
相同为0,不同为1
asciall码的0-127是确定的。其他可能在-128-1或者128-255两种分组
‘0’=48
'A'=65
'a'=97
sizeof关键字
sizeof(a=213+32*32+321/321)
只检测内容每项的数据类型,等同于
sizeof(a,213,32,32,321,321)(不分先后)
然后取最大的数据类型返回
sizeof(array[]) 取得数组总大小
移位
左移 补0
右移 补符号位
随机数
srand,rand需要stdlib.h
time需要time.h
srand((time(0));//设定种子
rand();
数组名
arr为一个地址常量,他的内容是数组的第一项地址。
&arr表示 将arr数组看作一个整体,对整个数组取地址,所以等于第一项地址
形参为 void表示接受任意参数
自学部分
一个具名数字 如 1; 实际类型为const int ;在代码区,不在堆,也不在栈
const int c=100;
100类型为const int 在代码区
c如果在 main函数里面数据局部变量,所以可以用指针改c
如果在main外面则数据全局变量区,无法更改
由于c++中int 的构造函数所以跟同种类型的变量还是不一样
c里面没有引用
int fun() const{}
常函数 不能修改其形参
fun1(1,fun)
函数名可以被传入,然后当作 *fun(int,int)来使用
int func(int(*a)(int,int) )
{
return a(1,5);
}
类的成员函数参数表
Sales_itm():a(0),b(0){}
类内部写的类函数默认为 inline
类的内部成员默认为private
类的const函数成员只能返回const classname&
类函数内部如果有和类成员有重名,可以使用this->xxx或者classname::xxx;
class_item *p =new class_item();
构造函数不能声明为 const,因为他的参数是自身,如果不能改变就不能初始化了
clsss_item *p=new class_item;
class_item a;
class_item b(xxxx);
类成员最好按照声明先后初始化
int x;
int y;
classname(int x):y(0),x(y){} //不错,但是会警告,避免这种操作
explicit关键字
抑制防止在调用构造函数时的隐式类型转换
只用于类内部的构造函数声明上
explicit Sales_item(std::istream &is);
友元
友元必须先被定义,不受权限修饰符影响
friend class Y;
friend void f(){}
friend void classname::f(){}
static在全局变量区,不会撤销,跟对象无关
复制构造函数
编译器会自动合成一个复制构造函数
Foo(const Foo&)
防止复制可以声明为private
防止一切复制,定义一个空的private函数
重载操作符
Foo& Foo::operator+(const Foo&)
一个参数默认为操作数的第二个
一个隐含参数this
或者
Foo operator+(const Foo&,const Foo&);
重载后不适用短路
operator+(item1,item2)
等同于
item1+item2
item1 +=item2
item1.operator+=(item2)
重载操作符之后需要重载相关操作符 如 +和+= <,>,==,!=
三法则
如果类需要析构函数,则它也需要赋值操作符和复制构造函数
类类转换只能使用一次
class intergral{
operator SmallInt() const{return val %256;}
}
intergral可以转换为smallint,smallint si(intergral);
转换之后不能再次以intergral转换了
在自动转换的时候会检测类能自动转换的情况,自动转换过后也可以接标准转换,尽量保证严格匹配。如果无法转换会报错
compute(xx);
如果xx的类型可以转换成compute所需类型且compute所需类型可以转换成xx类型会产生二义性
需要显式调用类型转换
compute(Yy(xx));
继承
class a:public father{}
派生类一般会重定义基类的虚函数,如果没有这样做就则使用基类版本
虚函数
virtual
对象的实际类型可能不同于对象引用uozhe指针的静态类型
Foo a;
Fdd *b=&a;
b将调用Fdd的虚函数
析构函数应该定义为虚函数
派生类中如果有个基类中虚函数同名的函数,不管参数是否相同,都会隐藏掉基类的虚函数
如果要保有原来的虚函数,需要重新定义一个和虚函数相同的函数
这时如果要调用基类虚函数,需要Base *p=&child;
如果派生类定义了和虚函数一样的函数,即使类型为基类,也会调用派生类
使用域操作符可以强制调用特定版本的虚函数
b->bfather::gg();
纯虚函数
virtual double aaa(int xx) const=0;
virtual const =0缺一不可
含有纯虚函数的类叫抽象基类,抽象基类不能被实例化
派生类可以在构造函数中初始化直接基类,可以使用初始化列表,也可以在函数体中构造
建议在派生类构造中提供实参,然后传递给基类构造函数
派生类的析构函数不负责撤销基类对象的成员
即使认为定义了析构函数,编译器还是会合成一个析构函数用来释放资源
培训部分 :
char 8个比特位 1字节
short 16个比特位 2字节
long int 32个比特位 4字节
在32位机器上int为long int
float 和long int一样
double 8字节
long long int 8字节
long double 12字节
bool类型需要外部载入 stdbool.h
补码
计算机内都是存储的补码
正数的补码等于其本身
负数的补码=1 0000 0000 -正数的补码
因为要借位,所以1 0000 0000-1
负数补码=正数补码求反+1
正数补码=负数补码-1 求反
八进制是三个二进制位打包
十六进制是四个二进制位打包
合成操作符的优先级很低
scanf清除错误的输入
scanf("%[^\n]");
scanf("%*c");
scanf里面如果有\n 会在回车之后继续读取
异或 ^
相同为0,不同为1
asciall码的0-127是确定的。其他可能在-128-1或者128-255两种分组
‘0’=48
'A'=65
'a'=97
sizeof关键字
sizeof(a=213+32*32+321/321)
只检测内容每项的数据类型,等同于
sizeof(a,213,32,32,321,321)(不分先后)
然后取最大的数据类型返回
sizeof(array[]) 取得数组总大小
移位
左移 补0
右移 补符号位
随机数
srand,rand需要stdlib.h
time需要time.h
srand((time(0));//设定种子
rand();
数组名
arr为一个地址常量,他的内容是数组的第一项地址。
&arr表示 将arr数组看作一个整体,对整个数组取地址,所以等于第一项地址
形参为 void表示接受任意参数
自学部分
一个具名数字 如 1; 实际类型为const int ;在代码区,不在堆,也不在栈
const int c=100;
100类型为const int 在代码区
c如果在 main函数里面数据局部变量,所以可以用指针改c
如果在main外面则数据全局变量区,无法更改
由于c++中int 的构造函数所以跟同种类型的变量还是不一样
c里面没有引用
int fun() const{}
常函数 不能修改其形参
fun1(1,fun)
函数名可以被传入,然后当作 *fun(int,int)来使用
int func(int(*a)(int,int) )
{
return a(1,5);
}
类的成员函数参数表
Sales_itm():a(0),b(0){}
类内部写的类函数默认为 inline
类的内部成员默认为private
类的const函数成员只能返回const classname&
类函数内部如果有和类成员有重名,可以使用this->xxx或者classname::xxx;
class_item *p =new class_item();
构造函数不能声明为 const,因为他的参数是自身,如果不能改变就不能初始化了
clsss_item *p=new class_item;
class_item a;
class_item b(xxxx);
类成员最好按照声明先后初始化
int x;
int y;
classname(int x):y(0),x(y){} //不错,但是会警告,避免这种操作
explicit关键字
抑制防止在调用构造函数时的隐式类型转换
只用于类内部的构造函数声明上
explicit Sales_item(std::istream &is);
友元
友元必须先被定义,不受权限修饰符影响
friend class Y;
friend void f(){}
friend void classname::f(){}
static在全局变量区,不会撤销,跟对象无关
复制构造函数
编译器会自动合成一个复制构造函数
Foo(const Foo&)
防止复制可以声明为private
防止一切复制,定义一个空的private函数
重载操作符
Foo& Foo::operator+(const Foo&)
一个参数默认为操作数的第二个
一个隐含参数this
或者
Foo operator+(const Foo&,const Foo&);
重载后不适用短路
operator+(item1,item2)
等同于
item1+item2
item1 +=item2
item1.operator+=(item2)
重载操作符之后需要重载相关操作符 如 +和+= <,>,==,!=
三法则
如果类需要析构函数,则它也需要赋值操作符和复制构造函数
类类转换只能使用一次
class intergral{
operator SmallInt() const{return val %256;}
}
intergral可以转换为smallint,smallint si(intergral);
转换之后不能再次以intergral转换了
在自动转换的时候会检测类能自动转换的情况,自动转换过后也可以接标准转换,尽量保证严格匹配。如果无法转换会报错
compute(xx);
如果xx的类型可以转换成compute所需类型且compute所需类型可以转换成xx类型会产生二义性
需要显式调用类型转换
compute(Yy(xx));
继承
class a:public father{}
派生类一般会重定义基类的虚函数,如果没有这样做就则使用基类版本
虚函数
virtual
对象的实际类型可能不同于对象引用uozhe指针的静态类型
Foo a;
Fdd *b=&a;
b将调用Fdd的虚函数
析构函数应该定义为虚函数
派生类中如果有个基类中虚函数同名的函数,不管参数是否相同,都会隐藏掉基类的虚函数
如果要保有原来的虚函数,需要重新定义一个和虚函数相同的函数
这时如果要调用基类虚函数,需要Base *p=&child;
如果派生类定义了和虚函数一样的函数,即使类型为基类,也会调用派生类
使用域操作符可以强制调用特定版本的虚函数
b->bfather::gg();
纯虚函数
virtual double aaa(int xx) const=0;
virtual const =0缺一不可
含有纯虚函数的类叫抽象基类,抽象基类不能被实例化
派生类可以在构造函数中初始化直接基类,可以使用初始化列表,也可以在函数体中构造
建议在派生类构造中提供实参,然后传递给基类构造函数
派生类的析构函数不负责撤销基类对象的成员
即使认为定义了析构函数,编译器还是会合成一个析构函数用来释放资源