每天一个C++小程序(求线段长度)

来源:互联网 发布:饲料配方软件 编辑:程序博客网 时间:2024/06/04 18:34

C++程序求线段长度

#include<iostream>#include<cmath>#define OK 1using namespace std;class Point{public:Point(int xx = 0, int yy = 0) { x = xx; y = yy;}Point(Point &p);//复制函数~Point() {};int getX() { return x; }int getY() { return y; }private:int x;int y;};//复制函数的实现Point::Point(Point &p){x = p.x;y = p.y;cout<<"Point复制构造函数被调用"<<endl;}//类的组合class Line{public:Line(Point xp1, Point xp2);//构造函数Line(Line &l);//复制函数~Line() {};void setLen();double getLen() { return len; }private:Point p1;Point p2;double len;};void Line::setLen(){double x = double(p1.getX() - p2.getX());double y = double(p1.getY() - p2.getY());len = sqrt(x*x + y*y);}//组合类的构造函数Line::Line(Point xp1, Point xp2):p1(xp1),p2(xp2){cout<<"Line构造函数被调用"<<endl;setLen();}//组合类的复制构造函数Line::Line(Line &l):p1(l.p1),p2(l.p2){cout<<"Line复制构造函数被调用"<<endl;len = l.len;}int main(){Point myp1(1, 1);Point myp2(4, 5);Line line(myp1, myp2);Line line2(line);cout<<"The length of the line is:";cout<<line.getLen()<<endl;cout<<"The length of the line2 is:";cout<<line2.getLen()<<endl;return OK;}
运行结果:
$g++ LineLenth.cpp -o LineLenth.out$ ./LineLenth.outPoint复制构造函数被调用Point复制构造函数被调用Point复制构造函数被调用Point复制构造函数被调用Line构造函数被调用Point复制构造函数被调用Point复制构造函数被调用Line复制构造函数被调用The length of the line is:5The length of the line2 is:5


C++中冒号(:)的用法

     (1)表示机构内位域的定义(即该变量占几个bit空间)
        typedef struct _XXX{
              unsigned char a:4;
              unsigned char c;
        } XXX;


     (2)构造函数后面的冒号起分割作用,是类给成员变量赋值的方法,初始化列表,更适用于成员变量的常量const型。
        struct _XXX{    _XXX() : y(0xc0)  { }   };

class MyClass{public:MyClass();//构造函数,无返回类型,可以由参数列表,这里省去MyClass(MyClass& myClass);//复制构造函数~MyClass();//析构函数private:int a;const int b;}//初始化列表MyClass::MyClass():a(1),b(1) {}//初始化列表的作用相当于在构造函数内进行相应成员变量的赋值,但两者是有差别的。//在初始化列表中是对变量进行初始化,而在构造函数内是进行赋值操作。两都的差别在对于像const类//型数据的操作上表现得尤为明显。我们知道,const类型的变量必须在定义时进行初始化,而不能对//const型的变量进行赋值,因此const类型的成员变量只能(而且必须)在初始化列表中进行初始化。MyClass::MyClass(){a = 1;//正确,效果相当于在初始化列表中进行初始化b = 1;//出错,const变量不能进行赋值操作;}

         初始化的顺序与成员变量声名的顺序相同。例如:myClass::myClass():b(1),a(b)  {}。

         这样的执行结果a,b各是多少呢?b=1,a=1?不是,b=1而a是个随机数。这一点是相当重要的哦,一般在初始化列表中进行初始化时,初始化的顺序应与声明的顺序保持一致,防止出现不必要的错误。


(3)public:和private:后面的冒号,表示后面定义的所有成员都是公有或私有的,直到下一个public:或private:出现为止。private:为默认处理。


     (4)类名冒号后面的是用来定义类的继承。

         class 派生类名 : 继承方式 基类名  {   派生类的成员   };
         继承方式:public、private和protected,默认处理是public

         对于继承的类来说,在初始化列表中也可以进行基类的初始化,初始化的顺序是先基类初始化,然后再根据该类自己的变量的声明顺序进行初始化。


C++中双冒号(::)的用法

(1)表示“域操作符”。
         例:声明了一个类A,类A里声明了一个成员函数void f(),但没有在类的声明里给出f的定义,那么在类外定义f时, 就要写成void A::f(),表示这个f()函数是类A的成员函数。
(2)直接用在全局函数前,表示是全局函数。
         例:在VC里,你可以在调用API 函数里,在API函数名前加 ::。
(3)表示引用成员函数及变量,作用域成员运算符。
          例:System::Math::Sqrt() 相当于System.Math.Sqrt()。

0 0