深拷贝与浅拷贝
浅拷贝:
实现对象间数据元素一一对应复制;
深拷贝:
当复制的对象是指针类型时,不复制该指针成员本身,而是复制指针所指的对象;
举例:
对象的浅拷贝:
#include<iostream>
using namespace std;
class IntArry
{
public:
IntArry(int n)//构造函数
{
data = new int [size];
size=n;
}
~IntArry()//析构函数
{
delete[]data;
}
int &Element(int n)
{
return data[n];
}
private:
int *data;
int size;
} ;
int main()
{
int n=2;
IntArry a(n);
a.Element(0)=5;//赋值
a.Element(1)=15;//赋值
IntArry b(a);//拷贝构造,浅拷贝
cout<<b.Element(0)<<endl<<b.Element(1)<<endl;
return 0;
}
输出:5 15
对象的深拷贝:
存疑。代码写到了在学;
对象数组:
声明:
类名 数组名【元素个数】;
访问方法:
通过下标访问
数组名【下标】.成员名;
Point A[2];
A[0].GetX();
对象数组的初始化:
1.被创建时,系统会调用类的构造函数初始化该对象;
2.通过初始化列表赋值:Point A[2]={Point (1,2),Point(3,4)};
数组元素所属类的构造函数:
不声明构造函数,就调用默认构造函数;
各元素对象的初值要求为相同的值时,可以声明具有默认形参值的构造函数。
各元素对象的初值要求为不同的值时,需要声明带形参的构造函数。
当数组每一个对象被删除时,调用一次析构函数;
对象指针:
声明方式:
类名 *对象指针名;
例子:
Point A(5,10);
Point *ptr;
ptr = &A;
通过指针访问对象成员:
对象指针名->成员名;
ptr->getx()相当于(*ptr).getx();
对象指针举例:
#include<iostream>
using namespace std;
class IntArry
{
public:
IntArry(int n)//构造函数
{
data = new int [size];
size=n;
}
~IntArry()//析构函数
{
delete[]data;
}
void print()
{
cout<<"指针引用成功";
}
private:
int *data;
int size;
} ;
int main()
{
IntArry a(5);
IntArry *ptr;//建立指针
ptr = &a;//指针赋值
ptr->print(); //指针引用
return 0;
}
输出:指针引用成功;
this 指针;
隐含于每一个类中成员函数中的特殊指针;
当通过一个对象调用成员函数式,系统间对象的地址赋给this指针,成员函数对对象进行操作时,隐含使用了this指针;
例如:
Point 类中的Set 函数中的语句:
X=xx;
Y=yy;
相当于:
this->X=xx;
this->Y=yy;
动态创建对象:Point *Ptr1 = new Point;
delete Ptr1;
Ptr1 = new Point(1.,2);
delete Ptr1;
动态创建数组:
Point *Ptr = new Point[2];
Ptr[0].move(5,10);
delete []Ptr;
动态数组类:有空再看,再补;
class Point
{ //类的声明同例6-16 … };
class ArrayOfPoints
{ public:
ArrayOfPoints(int n)
{ numberOfPoints=n; points=new Point[n]; }
~ArrayOfPoints()
{ cout<<"Deleting..."<<endl;
numberOfPoints=0; delete [ ] points;
}
Point& Element(int n)
{ return points[n]; }
private:
Point *points;
int numberOfPoints;
};
void main()
{
int number;
cout<<"Please enter the number of points:";
cin>>number;
//创建对象数组
ArrayOfPoints points(number);
//通过引用访问数组元素的成员:可以修改对象内部的数据成员;链式表达更简洁
points.Element(0).Set(5,10); points.Element(1).Set(15,20);
}
整行输入字符串:
cin.getline(字符数组St,字符个数N,结束符);
功能:一次连续读入多个字符(可以包含空格),知道读慢N个,或者遇到指定的结束符(默认‘\n’)。
读入的字符串存放于St中。读取但不存取结束符;
cin.get(字符数组名St,字符个数N,结束符);
功能:一次连续读入多个字符(可以包含空格),知道读慢N个,或者遇到指定的结束符(默认‘\n)
既不读取也不存储结束符;
举例:
{ char city[80];
char state[80];
int i;
for (i = 0; i < 2; i++)
{ cin.getline(city,80,',');
cin.getline(state,80,'\n');
}
字符串处理函数:
strcat(连接),strcpy(复制),strcmp(比较),strlen(求长度),
strlwr(转换为小写),strupr(转换为大写);
头文件:<cstring>;
例6.21 string类应用举例
#include <string>
#include <iostream>
using namespace std ;
void trueFalse(int x)
{
cout << (x? "True": "False") << endl;
}
void main()
{ string S1="DEF", S2="123";
char CP1[ ]="ABC";
char CP2[ ]="DEF";
cout << "S1 is " << S1 << endl;
cout << "S2 is " << S2 << endl;
cout<<"length of S2:"<<S2.length()<<endl;
cout << "CP1 is " << CP1 << endl;
cout << "CP2 is " << CP2 << endl;
cout << "S1<=CP1 returned ";
trueFalse(S1<=CP1);
cout << "CP2<=S1 returned ";
trueFalse(CP2<=S1);
S2+=S1;
cout<<"S2=S2+S1:"<<S2<<endl;
cout<<"length of S2:"<<S2.length()<<endl;
}
深拷贝与浅拷贝和字符串连接的一些知识
最新推荐文章于 2023-06-15 20:13:55 发布