return 0;
}
6-24 基于char*设计一个字符串类MyString,并且具有构造函数、析构函数、复制构造函数,
重载运算符“+”、“=”、“+=”、“[]”,尽可能完善它,使之能满足各种需要。(运算符重载功
能为选做,参见第8章)
解:#include
#include
using namespace std;
class MyString{
public:
MyString();
MyString(const char*const);
MyString(const MyString&);
~MyString();
char&operator[](unsigned short offset);
char operator[](unsigned short offset)const;
MyString operator+(const MyString&);
void operator +=(const MyString&);
MyString&operator =(const MyString&);
unsigned short getLen()const{
return itsLen;
}
const char*getMyString()const{
return itsMyString;
}
private:
MyString(unsigned short);
char*itsMyString;
unsigned short itsLen;
};
MyString::MyString(){
itsMyString=new char[1];
itsMyString[0]='0';
itsLen=0;
}
MyString::MyString(unsigned short len){
itsMyString=new char[itsLen+1];
for(unsigned short i=0;i<=len;i++)
itsMyString[i]='0';
itsLen=len;
}
MyString::MyString(const char*const cMyString){
itsLen=strlen(cMyString);
itsMyString=new char[itsLen +1];
for (unsigned short i=0;i itsMyString[i]=cMyString[i];
itsMyString[itsLen]='0';
}
MyString::MyString(const MyString&rhs){
itsLen=();
itsMyString=new char [itsLen +1];
for(unsigned short i=0;i itsMyString[i]=rhs[i];
itsMyString[itsLen]='0';
}
MyString::~MyString(){
delete[]itsMyString;
itsLen=0;
}
MyString&MyString::operator =(const MyString&rhs){
if(this==&rhs)
return *this;
delete[]itsMyString;
itsLen=();
itsMyString=new char[itsLen +1];
for(unsigned short i=0;i itsMyString[i]=rhs[i];
itsMyString[itsLen]='0';
return *this;
}
char&MyString::operator [](unsigned short offset){
if(offset>itsLen)
return itsMyString[itsLen-1];
else
return itsMyString[offset];
}
char MyString::operator [](unsigned short offset )const
{
if(offset>itsLen)
return itsMyString[itsLen-1];
else
return itsMyString[offset];
}
MyString MyString::operator +(const MyString&rhs){
unsigned short totalLen=itsLen+ ();
MyString temp (totalLen);
unsigned short i=0;
for(i=0;i temp[i]=itsMyString[i];
for (unsigned short j=0;j< ();j++,i++)
temp[i]=rhs[j];
temp[totalLen]='0';
return temp;
}
void MyString::operator +=(const MyString&rhs){
unsigned short rhsLen=();
unsigned short totalLen=itsLen+rhsLen;
MyString temp(totalLen);
unsigned short i=0;
for(i=0;i temp[i]=itsMyString[i];
for(unsigned short j=0;j< ();j++,i++)
temp[i]=rhs[i-itsLen];
temp[totalLen]='0';
*this =temp;
}
int main(){
MyString s1("initial test");
cout<<"S1:t"<
char*temp="Hello World";
s1=temp;
cout<<"S1:t"<
char tempTwo[20];
strcpy(tempTwo,";nice to be here!");
s1+=tempTwo;
}
cout<<"tempTwo :t"<cout<<"S1:t"<cout<<"S1[4]:t"<s1[4]='x';
cout<<"S1:t"<cout<<"S1[999]:t"<MyString s2("Another mystring");
MyString s3;
s3=s1+s2;
cout<<"S3:t"<MyString s4;
s4="why does this work?";
cout<<"S4:t"<return 0;
6-25 编写一个3×3矩阵转置的函数,在main()函数中输入数据。
解:#include
using namespace std;
void move(int a[3][3])
{
int i,j,k;
for(i=0;i<3;i++)
for(j=0;j<3;j++)
{
k=a[i][j];
a[i][j]=a[j][i];
a[j][i]=k;
}
}
int main(){
int i,j;
int data[3][3];
cout<<"输入矩阵的元素"< for(i=0;i<3;i++)
for(j=0;j<3;j++)
{
cout<<"第"<
cin>>data[i][j];
}
cout<<"输入的矩阵为:"< for(i=0;i<3;i++){
for (j=0;j<3;j++)
cout< cout< }
move(data);
cout<<"转置后的矩阵为:"< for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
cout< cout< }
return 0;
}
6-26 编写一个矩阵转置的函数,矩阵的行数和列数在程序中由用户输入。
解:
#include
using namespace std;
void move(int*a,int n)
{
int i,j,k;
for(i=0;i for(j=0;j {
k=*(a+i*n+j);
*(a+i*n+j)=*(a+j*n+i);
*(a+j*n+i)=k;
}
}
int main(){
int n,i,j;
int*p;
cout<<"请输入矩阵的行、列数:";
cin>>n;
p=new int [n*n];
cout<<"输入矩阵的元素"< for(i=0;i for(j=0;j {
cout<<"第"<
cin>>p[i*n+j];
}
}
cout<<"输入的矩阵为:"<for(i=0;i{
for(j=0;j cout<
cout<}
move(p,n);
cout<<"转置后的矩阵为:"<for(i=0;i{
for(j=0;j cout<
cout<}
return 0;
6-27定义一个Employee类,其中包括表示姓名、街道地址、城市和邮编等属性,包括setName()
和display()等函数;display()使用cout语句显示姓名、地址、城市和邮编等属性,函数setName()
改变对象的姓名属性,实现并测试这个类。
解:#include
#include
using namespace std;
class Employee
{
private:
char name[30];
char street[30];
char city[18];
char zip[6];
public:
Employee(char*n,char*str,char*ct,char*z);
void setName (char*n);
void display();
};
Employee::Employee(char*n,char*str,char*ct,char*z)
{
strcpy(name,n);
strcpy(street,str);
strcpy(city,ct);
strcpy(zip,z);
}
void Employee::setName (char*n)
{
strcpy(name,n);
}
void Employee ::display (){
cout< cout<}
int main(){
Employee e1("逗逼","马勒戈壁3号","葫芦岛","042800");
y ();
cout< e("傻逼");
y ();
cout< return 0;
}
6-28分别将例6-10程序和6-16程序中对指针的所有使用都改写为与之等价的引用形式,比
较修改前后的程序,体会在哪些情况下使用指针更好,哪些情况下使用引用更好。
解:6-10
#include
using namespace std;
void splitFloat(float x,int&intPart ,float&fracPart){
intPart=static_cast(x);
fracPart=x - intPart;
}
int main(){
cout<<"Enter 3 float point numbers:"< for(int i=0;i<3;i++){
float x,f;
int n;
cin>>x;
splitFloat(x,n,f);
cout<<"Interger Part="< }
return 0;
}
6-16
#include
using namespace std;
class Point {
public:
Point (): x(0),y(0) {
cout<<"Default Constructor called."< }
Point(int x ,int y):x(x),y(y){
cout<<"Constructor called."< }
~Point (){cout<<"Destructor called ."< int getX()const{return x;}
int getY()const{ return y;}
void move (int newX,int newY){
x=newX;
y=newY;
}
private:
int x,y;
};
int main (){
cout<<"Step one:"< Point &ptrl=*new Point;
delete &ptrl;
cout<<"Step Two:"< ptrl=*new Point(1,2);
}
delete &ptrl;
return 0;
6-29运行下面的程序,观察执行结果,指出该程序是如何通过指针造成安全性隐患的,思考
如何避免这种情况的发生。
#include
using namespace std;
int main() {
int arr[]={1,2,3};
double*p=reinterpret_cast(&arr[0]);
*p=5;
cout< return 0;
}
解:在32位平台下,一般int是4个字节,double 是8个字节,代码第5、6行强制转换后
的赋值过程中修改了arr[0] , arr [1] , 的内存空间,因此导致arr[1]的非预期输出。
避免这种情况的措施:1、尽量避免使用类型转换;2、必须使用类型转换时,尽量开辟新的
内存空间,在新内存空间中完成转换。3、必须使用原有内存空间时,要特别注意各种数据类
型在不同平台下的内存占用大小。
6-30 static_cast,const_cast和reinterpret_cast各自应在哪些情况下使用?
解:static_cast运算符实现类型间的转换,但没有运行时类型检查来保证转换的安全性。
Cosnt_cast运算符用来修改类型的const或volatile属性。可以去除对象或者变量const或
volatile属性。
Reinterpret_cast可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针。
发表评论