C++学习笔记-day09

1、封装-设计案例-点和圆的关系

 

#include<iostream>
using namespace std;

//点和圆关系案例
// 点类
class Point
{
public:
    //设置x坐标
    void setX(int x)
    {
        m_X = x;
    }
    //获取x坐标
    int getX()
    {
        return m_X;
    }
    //设置y坐标
    void setY(int y)
    {
        m_Y = y;
    }
    //获取y坐标
    int getY()
    {
        return m_Y;
    }
private:
    int m_X;
    int m_Y;
};
//圆类
class Circle
{
public:
    //设置半径
    void setR(int r)
    {
        m_R = r;
    }
    //获取半径
    int getR()
    {
        return m_R;
    }
    //设置圆心
    void setCenter(Point Center)
    {
        m_Center = Center;
    }
    //获取圆心
    Point getCenter()
    {
        return m_Center;
    }
private:
    int m_R;
    Point m_Center;
};

//判断点和圆的关系
void isInCircle(Circle& c, Point& p)
{
    //计算两点之间距离的平方
    int distance =
        (c.getCenter().getX() - p.getX()) * (c.getCenter().getX() - p.getX()) +
        (c.getCenter().getY() - p.getY()) * (c.getCenter().getY() - p.getY());
    //再计算半径的平方
    int rDistance = c.getR() * c.getR();

    //判断关系
    if (distance == rDistance)
    {
        cout << "点在圆上" << endl;
    }
    else if (distance > rDistance)
    {
        cout << "点在圆外" << endl;
    }
    else
    {
        cout << "点在圆内" << endl;
    }
}

int main()
{

    //创建圆
    Circle C;
    C.setR(10);
    Point center;
    center.setX(10);
    center.setY(0);
    C.setCenter(center);

    //创建点
    Point p;
    p.setX(10);
    p.setY(10);
    //判断二者的关系
    isInCircle(C,p);
    system("pause");
    return 0;
}

2、对象的初始化和清理

 

 

 

 

 

 

 

 

 

 构造函数的分类及调用

#include<iostream>
using namespace std;

//1构造函数的分类及调用
//分类
// 按照参数分类 无参构造(默认构造)和有参构造
// 按照类型分类 普通构造和拷贝构造

class Person
{
public:

    Person()
    {
        cout << "调用Person无参(默认)构造函数" << endl;
    }
    Person(int a)
    {
        age = a;
        cout << "调用Person有参构造函数" << endl;
    }
    //拷贝构造函数
    Person(const Person &p)
    {
        //将传入人的所有属性拷贝到当前对象的身上
        age = p.age;
        cout << "调用Person拷贝构造函数" << endl;


    }


    ~Person()
    {
        cout << "调用Person析构函数" << endl;
    }

    int age;
};

//调用

void test01()
{
    //1、括号法
    //Person p1; // 默认构造函数调用
    //Person p2(10); //有参构造函数

    ////拷贝构造函数

    //Person p3(p2);
    //注意事项
    //调用默认构造函数的时候,不要加()
    //下面这行代码编译器会认为是函数的声明,不会认为在创建对象 
    // Person p4();
    //cout << "p2的年龄" << p2.age << endl;

    //cout << "p3的年龄" << p3.age << endl;
    //2、显示法
    Person p1;
    Person p2 = Person(10); //有参构造
    Person p3 = Person(p2); //拷贝构造

    //person(10) 匿名对象 特点:当前行执行结束后系统会立即回收掉匿名对象

    //不要利用拷贝构造函数来初始化匿名对象 编译器会认为 Person(p3)==Person p3


    //3、隐式转换法

    Person p4 = 10; //有参构造 相当于写了 Person p4=Person(10);
    Person p5 = p4; //拷贝构造
}


int main()
{
    test01();
    system("pause");
    return 0;
}

 

 

拷贝函数调用时机

 

#include<iostream>
using namespace std;

//拷贝函数调用时机

//1、使用一个创建完毕的对象来初始化一个新对象

//2、值传递的方式给函数参数传值


//3、值方式返回局部对象

class Person
{
public:
    Person()
    {
        cout << "Person默认构造函数调用" << endl;

    }
    Person(int age)
    {
        cout << "Person有参构造函数调用" << endl;
        m_Age = age;
    }
    Person(const Person& p)
    {
        cout << "Person拷贝构造函数调用" << endl;
        m_Age = p.m_Age;
    }

    ~Person()
    {
        cout << "Person析构函数调用" << endl;
    }
    int m_Age;

};


//1、已经创建完毕的对象来创建新对象
void test01()
{
    Person p1(20);
    Person p2(p1);
    cout << "p2的年龄是" << p2.m_Age << endl;
}
//2、值传递的方式给函数参数传值

void doWork(Person p)
{

}
void test02()
{
    Person p;
    doWork(p);
}

//值方式返回局部对象

Person dowork2()
{
    Person p1;
    cout << (int*)&p1<<endl;
    return p1;
}
void test03()
{
    Person p = dowork2();
    cout << (int*)&p << endl;
}

int main()
{
    //test01();
    //test02();
    test03();
    system("pause");
    return 0;
}

 

posted @ 2022-09-06 13:17  秦0710  阅读(15)  评论(0编辑  收藏  举报