⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 静态成员与友元.txt

📁 钱能主编 C++程序设计教程(第一版) 该书习题的答案代码
💻 TXT
字号:
//**************************
//**      ch15_1.cpp      **
//**************************
#include <iostream.h>
#include <string.h>

class Student
{
public:
	Student(char* pName="noName")
	{
		cout<<"creat one student"<<endl;
		strcpy(name,pName);
		noOfStudents++;
		cout<<noOfStudents<<endl;
	}
	~Student()
	{
		cout<<"destruct one student"<<endl;
		noOfStudents--;
		cout<<noOfStudents<<endl;
	}
	static int number()
	{
		return noOfStudents;
	}
protected:
	static int noOfStudents;
	char name[40];
};
int Student::noOfStudents=0;

void fn()
{
	Student s1;
	Student s2;
	cout<<Student::number()<<endl;
}

void main()
{
	fn();
	cout<<Student::number()<<endl;
}
ch15_2.cpp与 ch15_1相同,略。

//**************************
//**      ch15_3.cpp      **
//**************************
#include <iostream.h>

class Student
{
public:
	static int noOfStudents;
	Student& nextStudent()
	{
		noOfStudents++;
		return *this;
	}
};
int Student::noOfStudents=0;

void fn(Student& s)
{
	cout<<(s.nextStudent()).noOfStudents<<endl;
}

void main()
{
	Student ss;
	fn(ss);
}

//**************************
//**      ch15_4.cpp      **
//**************************
#include <iostream.h>
#include <string.h>

class Student
{
public:
	Student(char* pName);
	~Student();
protected:
	static Student* pFirst;
	Student* pNext;
	char name[40];
};
Student* Student::pFirst=0;
Student::Student(char* pName)
{
	strncpy(name,pName,sizeof(name));
	name[sizeof(name)-1]='\0';
	pNext=pFirst;
	pFirst=this;
	cout<<"in constructor:"<<name<<endl;
}
Student::~Student()
{
	cout<<this->name<<endl;

	if(pFirst==this)
	{
		pFirst=pNext;
		return;
	}
	for(Student* pS=pFirst;pS;pS=pS->pNext)
	{
		if(pS->pNext==this)
		{
			pS->pNext=pNext;
			return;
		}
	}
}

Student* fn()
{
	Student* pS=new Student("Jenny");
	Student sb("Jone");
	return pS;
}

void main()
{
	Student sa("Jamsa");
	Student* sb=fn();
	Student sc("Tracey");
	delete sb;
}

//**************************
//**      ch15_5.cpp      **
//**************************
#include <iostream.h>

class Student
{
public:
	static int number()
	{
		return noOfStudents;
	}
protected:
	char name[40];
	static int noOfStudents;
};
int Student::noOfStudents=1;

void main()
{
	Student s;
	cout<<s.number()<<endl;
	cout<<Student::number()<<endl;
}

//**************************
//**      ch15_6.cpp      **
//**************************
#include <iostream.h>
#include <string.h>

class Student
{
public:
	Student(char* name);
	~Student();
	static Student* findname(char* pName);
protected:
	static Student* pFirst;
	Student* pNext;
	char name[40];
};

Student* Student::pFirst=0;
Student::Student(char* pName)
{
	strncpy(name,pName,sizeof(name));
	name[sizeof(name)-1]='\0';
	pNext=pFirst;
	pFirst=this;
}
Student::~Student()
{
	if(pFirst==this)
	{
		pFirst=pNext;
		return;
	}
	for(Student* pS=pFirst;pS;pS=pS->pNext)
	{
		if(pS->pNext==this)
		{
			pS->pNext=pNext;
			return;
		}
	}
}
Student* Student::findname(char* pName)
{
	for(Student* pS=pFirst;pS;pS=pS->pNext)
	{
		if(strcmp(pS->name,pName)==0)
		{
			return pS;
		}
	}		
	return (Student*)0;
}

void main()
{
	Student s1("Randy");
	Student s2("Jenny");
	Student s3("Kinsey");
	
	Student* pS=Student::findname("Jenny");
	if(pS)
		cout<<"ok."<<endl;
	else
		cout<<"no find."<<endl;
}

//**************************
//**      ch15_7.cpp      **
//**************************
#include <iostream.h>
#include <stdlib.h>
#include <memory.h>

class Vector
{
public:
	Vector(int);
	~Vector() {delete []v;}
	Vector(Vector &vec);
	int Size() {return sz;}
	void Display();
	int& Elem(int);
protected:
	int* v;
	int sz;
};

Vector::Vector(int s)
{
	if(s<=0)
	{
		cerr<<"bad Vector size."<<endl;
		exit(1);
	}
	sz=s;
	v=new int[s];
}
int& Vector::Elem(int i)
{
	if(i<0||sz<=i)
	{
		cerr<<"Vector index out of range."<<endl;
		exit(1);
	}
	return v[i];
}
Vector::Vector(Vector& vec)
{
	v=new int[sz=vec.sz];
	memcpy((void*)v,(void*)vec.v,sz*sizeof(int));
}
void Vector::Display()
{
	for(int i=0;i<sz;i++)
		cout<<v[i]<<" ";
	cout<<endl;
}

class Matrix
{
public:
	Matrix(int,int);
	Matrix(Matrix &);
	~Matrix() {delete []m;}
	int SizeL() {return szl;}
	int SizeR() {return szr;}
	int& Elem(int,int);
protected:
	int* m;
	int szl;
	int szr;
};

Matrix::Matrix(int i,int j)
{
	if(i<=0||j<=0)
	{
		cerr<<"bad Matrix size."<<endl;
		exit(1);
	}
	szl=i;
	szr=j;
	m=new int[i*j];
}

Matrix::Matrix(Matrix &mat)
{
	szl=mat.szl;
	szr=mat.szr;
	m=new int[szl*szr];
	memcpy((void*)m,(void*)mat.m,szl*szr*sizeof(int));
}

int& Matrix::Elem(int i,int j)
{
	if(i<0||szl<=i||j<0||szr<=j)
	{
		cerr<<"Matrix index out of range."<<endl;
		exit(1);
	}
	return m[i*szr+j];
}

Vector Multiply(Matrix& m, Vector& v)
{
	if(m.SizeR()!=v.Size())
	{
		cerr<<"bad multiply Matrix with Vector."<<endl;
		exit(1);
	}
	Vector r(m.SizeL());

	for(int i=0;i<m.SizeL();i++)
	{
		r.Elem(i)=0;
		for(int j=0;j<m.SizeR();j++)
			r.Elem(i)+=m.Elem(i,j) * v.Elem(j);
	}
	return r;
}

void main()
{
	Matrix ma(4,3);
	ma.Elem(0,0)=1; ma.Elem(0,1)=2; ma.Elem(0,2)=3;
	ma.Elem(1,0)=0; ma.Elem(1,1)=1; ma.Elem(1,2)=2;
	ma.Elem(2,0)=1; ma.Elem(2,1)=1; ma.Elem(2,2)=3;
	ma.Elem(3,0)=1; ma.Elem(3,1)=2; ma.Elem(3,2)=1;

	Vector ve(3);
	ve.Elem(0)=2; ve.Elem(1)=1; ve.Elem(2)=0;

	Vector va=Multiply(ma,ve);
	va.Display();
}

//**************************
//**      ch15_7.cpp      **
//**   (friend version)   **
//**************************
#include <iostream.h>
#include <stdlib.h>
#include <memory.h>

class Matrix;  // the class declaration is very important here,
               // without the declaration, the program could't pass compilation

class Vector
{
public:
	Vector(int);
	~Vector() {delete []v;}
	Vector(Vector &vec);
	//int Size() {return sz;}
	void Display();
	int& Elem(int);
	friend Vector Multiply(Matrix &m,Vector &v);
protected:
	int* v;
	int sz;
};

Vector::Vector(int s)
{
	if(s<=0)
	{
		cerr<<"bad Vector size."<<endl;
		exit(1);
	}
	sz=s;
	v=new int[s];
}
int& Vector::Elem(int i)
{
	if(i<0||sz<=i)
	{
		cerr<<"Vector index out of range."<<endl;
		exit(1);
	}
	return v[i];
}
Vector::Vector(Vector& vec)
{
	v=new int[sz=vec.sz];
	memcpy((void*)v,(void*)vec.v,sz*sizeof(int));
}
void Vector::Display()
{
	for(int i=0;i<sz;i++)
		cout<<v[i]<<" ";
	cout<<endl;
}

class Matrix
{
public:
	Matrix(int,int);
	Matrix(Matrix &);
	~Matrix() {delete []m;}
	//int SizeL() {return szl;}
	//int SizeR() {return szr;}
	int& Elem(int,int);
	friend Vector Multiply(Matrix &m, Vector &v);
protected:
	int* m;
	int szl;
	int szr;
};

Matrix::Matrix(int i,int j)
{
	if(i<=0||j<=0)
	{
		cerr<<"bad Matrix size."<<endl;
		exit(1);
	}
	szl=i;
	szr=j;
	m=new int[i*j];
}

Matrix::Matrix(Matrix &mat)
{
	szl=mat.szl;
	szr=mat.szr;
	m=new int[szl*szr];
	memcpy((void*)m,(void*)mat.m,szl*szr*sizeof(int));
}

int& Matrix::Elem(int i,int j)
{
	if(i<0||szl<=i||j<0||szr<=j)
	{
		cerr<<"Matrix index out of range."<<endl;
		exit(1);
	}
	return m[i*szr+j];
}

Vector Multiply(Matrix& m, Vector& v)
{
	if(m.szr!=v.sz)
	{
		cerr<<"bad multiply Matrix with Vector."<<endl;
		exit(1);
	}
	Vector r(m.szl);

	for(int i=0;i<m.szl;i++)
	{
		r.v[i]=0;
		for(int j=0;j<m.szr;j++)
			r.v[i]+=m.m[i*m.szr+j] * v.v[j];
	}
	return r;
}

void main()
{
	Matrix ma(4,3);
	ma.Elem(0,0)=1; ma.Elem(0,1)=2; ma.Elem(0,2)=3;
	ma.Elem(1,0)=0; ma.Elem(1,1)=1; ma.Elem(1,2)=2;
	ma.Elem(2,0)=1; ma.Elem(2,1)=1; ma.Elem(2,2)=3;
	ma.Elem(3,0)=1; ma.Elem(3,1)=2; ma.Elem(3,2)=1;

	Vector ve(3);
	ve.Elem(0)=2; ve.Elem(1)=1; ve.Elem(2)=0;

	Vector va=Multiply(ma,ve);
	va.Display();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -