📄 静态成员与友元.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 + -