友元docWord文件下载.docx
《友元docWord文件下载.docx》由会员分享,可在线阅读,更多相关《友元docWord文件下载.docx(7页珍藏版)》请在冰豆网上搜索。
名空间:
匿名空间:
只在当前文件可访。
不同的名空间划定了不同的作用域
1、打开名空间:
usingnamespacestd;
(避免在头文件中直接打开)
2、打开指定名称:
Usingstd:
:
cout;
打开名空间的cout
endl;
打开名空间中的endl
3、直接指定具体空间的标识符(头文件中使用):
std:
stringname;
Std:
iostreamname;
Const不变、不能被修改;
修饰对象(初始化后不变,只读不写)或成员函数(不改变数据的成员);
Const对整个对象只读不写
常用成员只能常调用常用函数
类名const对象名(参数);
Const类名对象名(参数);
Operate+已声明为complex类的友元函数
杜绝a+b=c
ConstComplexoperator+(constcomplex&
c1,constcomplex&
c2){}
Const区分重载,const成员函数不改变对象的成员数据
当const和&
一起使用时,作用不同const------不变
&
---------不是副本,返回的是引用
Int&
--------返回的是引用
Int————返回的是副本int的值
&
返回保证其元素本身
Const返回保证其元素不变
2011-4-20
Viod*————指向不确定类型
Typedefintstatus;
(定义一个*****)
(*fun)(x1,x2)——函数指针
Typedef函数名(*)(x1,x2)记为pfun
等价于函数名(*pfun)(x1,x2)
Ssort()
返回值的形式——返回值是void无法实现++a的形式
Point形式的可返回变化了的a;
指针常量:
声名必须初始化;
初始化后不能修改
可以修改指向的变量的值
关键:
不能通过指针改变所指对象的值(可以是变量),但指针本身可以改变,可以指向另外的对象。
Constinta=10;
Constint*ptr;
P=&
a;
//对
*p=20//错
Intb=50;
b;
*p=60;
//错
This指针式指针常量,不允许被修改,只能修改其指向的对象
//Const修饰成员变量,实际上限定了
NewT与newT()区别
Int*ptr=newint;
//未初始化
Int*ptr=newint();
//初始化为0
Int*ptr=newint(10);
//初始化为10
Point*ptr=newpoint[];
Point*ptr=mewpoint[10]();
//对所有成员按照newT()初始化;
拷贝:
深拷贝和浅拷贝
深拷贝:
写构造函数。
整个函数,和复制之前一模一样
浅拷贝:
首地址
ArrayOfPoints.h声明函数
ArrayOfPoints(intsize=10);
析构函数:
~ArrayOfPoints();
拷贝构造ArrayOfPoints(constArrayOfPoints&
array);
ArrayOfPoints.cpp定义函数
ArrayOfPoints:
ArrayOfPoints(intsize/*=10*/){}
析构函数ArrayOfPoints:
~ArrayOfPoints(){}
拷贝构造ArrayOfPoints:
ArrayOfPoints(constArrayOfPoints&
array)
:
size(array.size){}
数据的对考,重新开空间:
Size=array.size;
Points[i]=newpoint[size];
For(inti=0;
i<
size;
i++){
point[i]=array.point[i];
String类:
Typedefbasic_string<
char>
string;
Strings;
——空串
Strings(str);
——拷贝构造
Strings(str,1);
——生成由str的位置1开始的字符串
strings(str,1,3);
——生成由str的位置1开始的长度为3的字符串
strings(“abc”);
strings(“abcdef”,4);
——s=“abcd”
strings(5,‘x’);
g(,);
——s=“xxxxx”
strings(beg,end);
——由迭代器区间(beg,end)内的字符生成
常用操作符:
Getline整行输入(第三参数为分隔符)
Cpp_07:
继承与派生:
1、继承方式与基类成员的访问控制
2、派生类的构造与析构
3、赋值兼容原则
4、派生类作用域与同名隐藏
5、多继承与虚基类
派生类(子类)继承基类(父类)
——全盘吸收(构造、析构除外)
——改造(重写基类相关的函数)
——新添()
派生类的定义:
Class派生类名:
继承方式/*public、private、protected*/基类名
{新增成员的声明};
默认缺省继承方式是private
1、继承方式与基类成员的访问控制属性
基类private对于一切继承方式都不可访问
基类protected对于继承方式为public为protected
其他的继承方式相一致
基类为public对于一切继承方式和基类相一致
派生类成员与基类成员重名时,隐藏基类的同名成员(同名隐藏,调用新增函数或成员)
引用基类成员时,加类名限定。
派生类内能通过派生类的对象访问基类的protected成员
而不能通过基类的对象访问
要通过对象访问private或protected成员只有在类内
派生类的构造函数:
先初始化基类成员,再初始化派生类的成员
基类成员的初始化由基类的构造函数负责
基类成员的初始化由初始化列表完成
定义:
派生类名(形参列表):
基类名(参数),新增成员名1(参数),新增成员2(参数)
{派生类构造函数体}
执行顺序:
按继承时声明的顺序,调用基类构造函数
按成员声明的顺序,调用新增成员的构造函数
执行构造函数的代码体
构造函数的声明:
类名:
调用的函数(参数),调用的函数(参数){函数内容};
复制兼容规则:
原则:
先拷贝基类部分,再拷贝派生类新增成员
基类部分的拷贝根据赋值兼容原则,直接传派生类的对象
Circle:
Circle(constCircle&
circle)
Point(circle)/*基类拷贝point(circle.x,circle.y)逻辑错误,对象要对拷,整体的拷贝是各部分拷贝的组合*/,radius(circle.radius){}
Derived:
Derived(constDerived&
d)Derived:
d)
Base1(d),Base2(d),Base3(d),//全部采用基类默认的拷贝构造
member1(d.member1),//私有成员类内数据的对拷
member2(d.member2),
member3(d.member3){}//数据的对拷
static成员的继承:
整个的继承体系的所有对象共享基类的static成员
允许访问的前提下,可以通过基类名或者派生类名访问static成员
拷贝构造:
point(constpoint&
point)前者是后者的拷贝函数
:
x(point.x),y(point.y){代码}
**公有继承才能把派生类作为基类成员
编译器对名字的查找过程////local:
派生类成员函数局部
global
含Base的namespace(s)
Base
Derived
Local
多继承时的同名隐藏
虚基类(虚拟继承)首次定义加virtual
虚拟继承时派生类的构造:
Base1,base2两条路径继承来的基类base0的构造由派生类derived确定,在derived的初始化列表中要明确base0的构造
Derived类(base1,base2共同公有派生类)的初始化包括主父基类的初始化和base0的初始化
虚拟继承中,base1和base2中关于base0的定义被忽略
组合与继承:
Public派生继承基类的全部接口,is-a关系
派生类对象的内存布局:
赋值兼容原则,
一个基类指针无论是指向基类对象,还是指向派生类对象,通过它来访问一个基类中定义的成员,可以通过一种方式
基类的指针能指向派生类的对象
栈区里指针指向低端地址,堆区里也一样
Base1*pb1b=pd;
Base2*pb2b=pd;
反直观的结论:
pb1b和pb2b的值不同;
指针的转换并非地址值的复制