c++,c语言易错点之类与对象
来源:互联网 发布:淘宝助理怎么下载不了 编辑:程序博客网 时间:2024/05/15 15:37
拷贝构造
浅赋值
#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.非静态成员函数可以任意地访问静态成员函数和静态数据成员。
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声明语句所在的类对象中的私有和公有成员
通过友元成员函数,不仅可以访问自己所在类对象中的私有和公有成员,还可访问由关键字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 <友元类名>;
当一个类成为另一个类的友元类时,这个类的所有成员函数都成为另一个类的友元函数
友元类的声明可以放在类声明中的任何位置。
友元关系是不能传递的。类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
- c++,c语言易错点之类与对象
- objective-c之类与对象
- Objective-C之类和对象
- C#OOP之类和对象
- C语言与面向对象
- Objective-C语法之类和对象
- Objective-C语法之类和对象
- 4,Objective-C语法之类和对象
- Objective-C语法之类和对象
- 3、Objective-C语法之类和对象
- Objective-C语法之类和对象
- Objective C之类和对象
- Objective-C语法之类和对象
- Objective-C语言学习之类和实例
- Objective-C对象之类对象和元类对象
- Objective-C对象之类对象和元类对象
- Objective-C对象之类对象和元类对象
- Objective-C之类的声明与创建
- Pairs(hashset的查找应用)
- CCEditBox/CCEditBoxImplTizen
- PAT A 1058. A+B in Hogwarts (20)
- JS弹出居中的DIV的代码
- 千万数量级分页存储过程
- c++,c语言易错点之类与对象
- CCEditBox/CCEditBoxImplNone
- 云时代的内容管理:安全性与信息透明度两全其美
- Sql server时间格式
- Hadoop-2.2.0中文文档——Common-Hadoop HTTP web控制台认证
- Oracle 的 Lpad()/Rpad()函数的用法 介绍
- CCEditBox/CCEditBoxImplMac
- Http文件上传
- Dell 第 11 代 PowerEdge 服务器获得 Red Hat Enterprise Linux 6.0 认证