c++,c语言易错点之类与对象

拷贝构造

浅赋值

#include<iostream>
#include<cstring>
using   namespace std;
class Point
{
private:
   double x, y;
   char *name;
public:
   
    Point(char *n=NULL, double x=0.0, double y=0.0);
   ~Point();
   void disp( );
};


Point::Point (char *n, double a, double b){
  x = a;  y = b;
  if(n) {
      name=new char[strlen(n)+1];
      strcpy(name,n);
  }
  else{
       name=new char[8];
       strcpy(name,"no name");
}
cout<<name<<"  constructing"<<endl;
}

Point::~Point(){
    cout<<name<<"  destructing"<<endl;
    delete [] name;
}
void  Point::disp( ){  cout<<name<<":"<<x<<","<<y<<endl;  }
int main(){
   // 定义对象
   Point p1("home",1.0,2.0);
   Point p2("school",3.0);
   Point p3 ;
   // 输出对象
   cout<<"p1=";
   p1.disp();
   cout<<"p2=";
   p2.disp();
   cout<<"p3=";
   p3.disp();
   return 0;
}





深赋值拷贝构造

#include<iostream>
#include<cstring>
using   namespace std;
class Point
{
private:
   double x, y;
   char *name;
public:

    Point(char *n=NULL, double x=0.0, double y=0.0);
   ~Point();
   void disp( );
   Point(Point &p);
};


Point::Point (char *n, double a, double b){
  x = a;  y = b;
  if(n) {
      name=new char[strlen(n)+1];
      strcpy(name,n);
  }
  else{
       name=new char[8];
       strcpy(name,"no name");
}
cout<<name<<"  constructing"<<endl;
}

Point::~Point(){
    cout<<name<<"  destructing"<<endl;
    delete [] name;
}
void  Point::disp( ){  cout<<name<<":"<<x<<","<<y<<endl;  }
Point::Point(Point &p){
    cout<<"拷贝构造"<<endl;
        x = p.x;
        y = p.y;
    if(p.name!=NULL){
        name = new char[strlen(p.name)+1];
        strcpy(name,p.name);
    }
    else{
        name = new char[8];
        name = "no name";
    }
}
int main(){
   // 定义对象
   Point p1("home",1.0,2.0);
   Point p2("school",3.0);
   Point p3 ;
   Point p4 = p1;
   // 输出对象
   cout<<"p1=";
   p1.disp();
   cout<<"p2=";
   p2.disp();
   cout<<"p3=";
   p3.disp();
   p4.disp();
   return 0;
}




2、静态成员变量初始化

对于类X的定义:
class  X { 
public:
char  ch ;
static  int s;
 };
 int X::s = 0 ;
对象a、b、c、d的定义:
voidf( )
 { X  a ,b , c , d ; }

静态数据成员初始化:

<数据类型><类名>::<静态数据成员名>=<值>

如:intX::s = 0 ;

Ø 初始化在类体外进行,而前面不加 static
Ø 初始化时不加该成员的访问权限控制符 public protected private 等;
Ø 若未在类外初始化,程序连接时会出现错误
Ø sizeof 运算符不包含静态数据成员的空间

静态函数成员

static float getAverage();      //声明静态函数成员

floatStudent::getAverage(){return sum/3;} //实现时不需要static

普通的成员函数一般都隐含了一个this指针,静态成员函数由于不是与任何的对象相联系,因此它不具有this指针;
静态成员函数可以访问静态数据成员和访问静态成员函数,但是静态成员函数不能访问非静态成员函数和非静态数据成员;
非静态成员函数可以任意地访问静态成员函数和静态数据成员。

3、常对象和常成员的关系

常对象只能访问常成员和长函数,否则会出错

4、友元函数

1.普通的成员函数一般都隐含了一个this指针,静态成员函数由于不是与任何的对象相联系,因此它不具有this指针;
2.静态成员函数可以访问静态数据成员和访问静态成员函数,但是静态成员函数不能访问非静态成员函数和非静态数据成员;
3.非静态成员函数可以任意地访问静态成员函数和静态数据成员。
class Line
{
 private:
   double a, b, c;             //直线为ax+by+c=0的系数
 public: 
   Line(double a=0.0, double b=0.0, double c=0.0);
   void disp( );			
   friend double distance(Point p,Line l); //声明为Line的友元
};
Line::Line(double a, double b, double c){
	this->a = a;  this->b = b;  this->c = c; 
} 		
void  Line::disp( ){  
  cout<<"线("<<a<<"x+"<<b<<"y+"<<c<<"=0)";}

class Line
{
 private:
   double a, b, c;             //直线为ax+by+c=0的系数
 public: 
   Line(double a=0.0, double b=0.0, double c=0.0);
   void disp( );			
   friend double distance(Point p,Line l); //声明为Line的友元
};
Line::Line(double a, double b, double c){
	this->a = a;  this->b = b;  this->c = c; 
} 		
void  Line::disp( ){  
  cout<<"线("<<a<<"x+"<<b<<"y+"<<c<<"=0)";}

double distance(Point p,Line l){
   return fabs(l.a*p.x+l.b*p.y+l.c)/sqrt(l.a*l.a+l.b*l.b);
}	
int main(){
    Point p1(1.0,2.0);
    Line l1(3.0,4.0,5.0);
    p1.disp();
    l1.disp();
    cout<<"距离为:"<<distance(p1,l1)<<endl;
    return 0;
}

友元成员函数

如果一个类的成员函数是另一个类的友元函数,则称这个成员函数为友元成员函数;
通过友元成员函数,不仅可以访问自己所在类对象中的私有和公有成员,还可访问由关键字friend声明语句所在的类对象中的私有和公有成员
class Point
{
 private:
   double x, y;                  //x,y 坐标
 public: 
   Point(double x=0.0, double y=0.0);
   void disp( );
   double distance(Line l);  //声明为Point的成员
};
Point::Point (double x, double y){
	this->x = x;  this->y = y; 
} 		
void  Point::disp( ){  cout<<"点("<<x<<","<<y<<")";  }	

class Line
{
 private:
   double a, b, c;             //直线为ax+by+c=0的系数
 public: 
   Line(double a=0.0, double b=0.0, double c=0.0);
   void disp( );
   friend double Point::distance(Line l); //声明为Line的友元
};
  Line::Line(double a, double b, double c){
	this->a = a;  this->b = b;  this->c = c;    } 		
void  Line::disp( ){ 
    cout<<“线("<<a<<"x+"<<b<<"y+"<<c<<"=0)";}

class Line
{
 private:
   double a, b, c;             //直线为ax+by+c=0的系数
 public: 
   Line(double a=0.0, double b=0.0, double c=0.0);
   void disp( );
   friend double Point::distance(Line l); //声明为Line的友元
};
  Line::Line(double a, double b, double c){
	this->a = a;  this->b = b;  this->c = c;    } 		
void  Line::disp( ){ 
    cout<<“线("<<a<<"x+"<<b<<"y+"<<c<<"=0)";}

友元类

当一个类作为另一个类的友元时,称这个类为友元类。
当一个类成为另一个类的友元类时,这个类的所有成员函数都成为另一个类的友元函数
友元类的声明可以放在类声明中的任何位置。
 友元关系是不能传递的。类B是类A的友元,类C是类B的友元,并不表示类C是类A的友元。
 友元关系是单向的。类A是类B的友元,类A的成员函数可以访问类B的私有成员和保护成员,反之,类B不是类A的友元,类B的成员函数却不可以访问类A的私有成员和保护成员。

即(当在A类中把B类声明为友元类,则可以在B中随意访问A的成员)
友元类声明的形式如下:
firiend class <友元类名>; 
class Point
{
 private:
   double x, y;                  //x,y 坐标
 public: 
   Point(double x=0.0, double y=0.0);
   void disp( );
   friend class ComputeTools; //声明为Point的友元类
};
Point::Point (double x, double y){
	this->x = x;  this->y = y; 
} 		
void  Point::disp( ){  cout<<"点("<<x<<","<<y<<")";  }

class Line
{
 private:
   double a, b, c;             //直线为ax+by+c=0的系数
 public: 
   Line(double a=0.0, double b=0.0, double c=0.0);
   void disp( );		// 输出私有变量的成员函数
   friend class ComputeTools; //声明为Line的友元类
};
Line::Line(double a, double b, double c){
	this->a = a;  this->b = b;  this->c = c;  } 		
void  Line::disp( ){  
cout<<"线("<<a<<"x+"<<b<<"y+"<<c<<"=0)";}

class ComputeTools{
public:
    static double distance(Point p1,Point p2); //重载点与点距离
    static double distance(Point p,Line l); //重载点与直线距离
};
double ComputeTools::distance(Point p1,Point p2){
  return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y)); 
}
double ComputeTools::distance(Point p,Line l){
   return fabs(l.a*p.x+l.b*p.y+l.c)/sqrt(l.a*l.a+l.b*l.b);
 }

int main(){
    Point p1(1.0,2.0),p2(3.0,4.0); 	
    Line l1(3.0,4.0,5.0);
    p1.disp(); 	p2.disp();
    cout<<"距离为:"<<ComputeTools::distance(p1,p2)<<endl;
    p1.disp(); 	l1.disp();
    cout<<"距离为:"<<ComputeTools::distance(p1,l1)<<endl;
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值