C++第七节课作业

本文探讨了C++中类的组合构造,包括初始化顺序、类中嵌套类的访问权限,以及类中使用枚举类型的实例。还介绍了默认构造函数和移动语义的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.C++类的组合

  以另一个类的对象为数据成员

  必须使用初始化参数列表的方式去初始化 

#include<iostream>
#include<string>
using namespace std;
class Fox
{

public:
    Fox( string name, int age) :name1(name), age(age) {}//构造函数

protected:
    void printf1()
    {
        cout << name1 << age << endl;
    }
    string name1;
    int age;
};
class Fox2
{

public:
    Fox2(string yueyuename, int yueyueage, string fox2name) :yueyue(yueyuename, yueyueage) 
    {
      this->name = fox2name;
     //yueyue.printf1();//类外无法访问保护属性
    }//以另一个类的对象为数据成员
    Fox2(string Name) :name(Name), yueyue("默认名字", 18) {}
    void printdata() 
    {
        cout << name << endl;
    
    }
 
protected:
    string name;
    Fox yueyue;

};



int main()
{
    Fox2 susu("狐狸");
    Fox2 susu2("苏苏",3,"月月");
    
    while (1);
    return 0;
}

 类的组合构造顺序只和定义对象顺序的有关,和初始化参数列表无参。

#include<iostream>
#include<string>
using namespace std;
class A
{
public:
	A(string name) :name(name) 
	{
		cout << name << endl;
	}
	string name;

};

class B
{
public:
	B(string name) :name(name)
	{
		cout << name << endl;
	}
	string name;


};
class C
{
public:
	C(string name) :name(name)
	{
		cout << name << endl;
	}
	string name;

};
class D
{
public:
	D(string namea, string nameb,string namec) :b(nameb),c(namec), a(namea)
	{
		cout << this->name << endl;
	}
	B b;//b先构造
	A a;

	C c;
	string name;

};

int main()
{
	D d("狐狸1", "狐狸2", "狐狸3");
	//所以先打印狐狸2,在打印狐狸1,狐狸3

	return 0;
}

2.类种类

 类中类依旧受权限限定

 访问方式 需要类名限定

#include<iostream>
using namespace std;
struct Node
{
    int data;
    Node* next;
    Node() //无参数构造函数时下一个指向空
    {
      this->next = nullptr;
    }
    Node(int data)//构造有参数函数
    {
        this->next = nullptr;
        this->data = data;
    }
};
class List
{
public:
    List()
    {
        headNode = new Node;
    }
    void instrhead(int data)
    {
        Node* newNode = new Node(data);
        newNode->next = headNode->next;
        headNode->next = newNode;
    }

protected:
    Node* headNode;
public: //迭代器 类模仿指针的方式
        

    class iterator
    {
    public:
        iterator(Node* pMove = nullptr) :pMove(pMove) {}//构建一个对象 它指向的空
        void operator=(Node* pMove) //重载运算符等号,让类能赋值
        {
            this->pMove = pMove;
        }
        bool operator!=(Node* pMove) //如果不等于放回真
        {
            return this->pMove != pMove;
        }
        iterator operator++()//重载++ 运算符,放回的是下一个的地址
        {
            pMove = pMove->next;
            return iterator(pMove);
        }
        
        Node*& operator*()//返回的是一个Node*的指针
        {
            return pMove;
        }
    protected:
        Node* pMove;
    };
    Node* begin()  //开始的位置
    {
        return headNode->next;
    }
    Node* end()//结束的位置
    {
        return nullptr;
    }
};


int main()
{
    List list;
    for (int i = 0; i < 3; i++) {
        list.instrhead(i);//头部插入链表
    }
    List::iterator iter;
    for (iter = list.begin(); iter != list.end(); ++iter) //
    {
        cout << (*iter)->data;
    }

    return 0;
}



   

类中关于枚举类型

#include<iostream>
using namespace std;
//类中枚举类型

class  A
{
public:
	enum time { first, second };
protected:
	enum date { mon, sur, tus };
	//类中的枚举类型受权限限定
};
int main() 
{

	//cout << A::date::mon << endl; 类外不可以访问数据
	cout << A::time::first << endl;

}

C++默认构造函数

#include <iostream>
using namespace std;
class A
{
public:
	A() = default;//存在默认构造函数
	A(A& object) = default;//默认的拷贝构造
	//void print() = default;//没有默认的函数成员
	A& operator=(A& object) = default;//存在默认重载的运算符
	~A() = default;//存在默认析构函数
};
int main()
{
	A a;//默认构造函数
	A b = a;默认的拷贝构造
	A c;
	c = a; //默认重载的运算符
	return 0;
}

构造函数 2013没有移动语义的标准所以创建匿名对象时会调用拷贝构造,但2019不会调用拷贝构造,会直接转交所有权,不同版本有不同处理方式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值