您的位置:首页 > 编程语言 > C语言/C++

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

2017-03-02 17:44 585 查看

C++程序求线段长度

#include<iostream>
#include<cmath>

#define OK 1

using 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.out
Point复制构造函数被调用
Point复制构造函数被调用
Point复制构造函数被调用
Point复制构造函数被调用
Line构造函数被调用
Point复制构造函数被调用
Point复制构造函数被调用
Line复制构造函数被调用
The length of the line is:5
The 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()。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: