c++培训周总结1

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缺一不可


含有纯虚函数的类叫抽象基类,抽象基类不能被实例化


派生类可以在构造函数中初始化直接基类,可以使用初始化列表,也可以在函数体中构造
建议在派生类构造中提供实参,然后传递给基类构造函数


派生类的析构函数不负责撤销基类对象的成员


即使认为定义了析构函数,编译器还是会合成一个析构函数用来释放资源























评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值