首页 > 编程语言 >C++的类与对象下

C++的类与对象下

时间:2024-09-17 15:48:36浏览次数:3  
标签:hour 对象 Time1 C++ public int Date class

目录

1.初始化列表

2.隐式类型转换

1.单参数

2.多参数(C++11提供的新功能)

3.static成员

4.友元

5.内部类

6.匿名对象


1.初始化列表

C++祖师爷规定初始化列表是成员变量定义与初始化的地方。

class Time
{
public:
	Time(int hour)
		:_hour(hour)
	{
		cout << "Time()" << endl;
	}
private:
	int _hour;
};


class Date
{
public:
	Date(int& x, int year = 1, int month = 1, int day = 1)
		:_year(year)
		, _month(month)
		, _day(day)
		, _t(12)
		, _ref(x)
		, _n(1)
	{
		// error : “Time”: 没有合适的默认构造函数可⽤ 
		// error : “Date::_ref” : 必须初始化引⽤ 
		// error : “Date::_n” : 必须初始化常量限定类型的对象 
	}
	void Print() const
	{
		cout << _year << "-" << _month << "-" << _day << endl;
	}
private:
	int _year;
	int _month;
	int _day;
	Time _t; // 没有默认构造 
	int& _ref; // 引⽤ 
	const int _n; // const 
};
int main()
{
	int i = 0;
	Date d1(i);
	d1.Print();
	return 0;
}

初始化列表初始化变量的顺序与类里声明变量的顺序是一致的

2.隐式类型转换

1.单参数

class Time1
{
public:
	Time1(int hour=0)
		:_hour(hour)
	{

	}
	Time1(Time1& t)
	{
		_hour = t._hour;
	}
private:
	int _hour;
};

int main()
{
	//第一点:3会隐式类型转换成Time1类的对象,其中调用的就是构造函数
	//第二点:构造完临时对象后,就会将这个临时对象拷贝构造给t对象
	Time1 t = 3;
	return 0;
}

2.多参数(C++11提供的新功能)

class Time1
{
public:
	Time1(int hour1=0,int hour2=0)
		:_hour1(hour1)
		,_hour2(hour2)
	{

	}
	Time1(Time1& t)
	{
		_hour1 = t._hour1;
		_hour2 = t._hour2;
	}
private:
	int _hour1;
	int _hour2;
};

int main()
{
	//第一点:{3,3}会隐式类型转换成Time1类的对象,其中调用的就是构造函数
	//第二点:构造完临时对象后,就会将这个临时对象拷贝构造给t对象
	Time1 t = { 3, 3 };
	return 0;
}

const Time1& t = { 3,3 };

其中引用的话必须是const引用,因为{3,3}构造的临时对象具有常性,不能被改变。

3.static成员

静态成员不存在对象里,所以不走初始化列表。

// 实现⼀个类,计算程序中创建出了多少个类对象? 
#include<iostream>
using namespace std;
class A
{
public:
	A()
	{
		++_scount;
	}
	A(const A& t)
	{
		++_scount;
	}
	~A()
	{
		--_scount;
	}
	static int GetACount()
	{
		return _scount;
	}
private:
	// 类⾥⾯声明 
	static int _scount;
};
// 类外⾯初始化 
int A::_scount = 0;
int main()
{
	cout << A::GetACount() << endl;
	A a1, a2;
	A a3(a1);
	cout << A::GetACount() << endl;
	cout << a1.GetACount() << endl;
	// 编译报错:error C2248: “A::_scount”: ⽆法访问 private 成员(在“A”类中声明) 
	//cout << A::_scount << endl;
}

4.友元

class Date
{
	friend void Print(Date x);
public:
	Date(int hour, int minute)
	{
		_hour = hour;
		_minute = minute;
	}

private:
	int _hour;
	int _minute;
};

//Print函数需要访问Date类中的成员变量,所以需要将其设置为友元函数
void Print(Date x)
{
	cout << x._hour << '/' << x._minute << endl;
}
class Date
{
	friend class B;
public:
	Date(int hour, int minute)
	{
		_hour = hour;
		_minute = minute;
	}

private:
	int _hour;
	int _minute;
};


//如果一个类里面要频繁调用另一个类的私有成员变量,则可以将此类设置为另一个类的友元类
class B
{
public:
	void Print1(Date x)
	{
		cout << x._hour << endl;
	}
	void Print2(Date x)
	{
		cout << x._minute << endl;
	}
};

5.内部类

class B
{
private:
	int a;
	int b;

public:
	//A默认是B的友元类
	class A
	{
	public:
		void Print(B c)
		{
			cout << c.a << c.b << endl;
		}
	};
};

6.匿名对象

class Date
{
public:
	Date(int hour = 0)
	{
		_hour = hour;
	}
	void Print()
	{
		cout << _hour << endl;
	}


private:
	int _hour;
};



int main()
{
	//定义有名对象
	Date d;
	Date d1(1);


	//匿名对象
	Date();
	Date(1);
	//当我们只想要调用函数时,用匿名对象比较方便
	Date().Print();


	return 0;
}

标签:hour,对象,Time1,C++,public,int,Date,class
From: https://blog.csdn.net/GGbond665/article/details/142306498

相关文章

  • 4.C++中程序中的命名空间
    咱们在前面的程序中,提到过使用usingnamespacestd;引入这个命名空间,那么std就是由编程系统提供的标准命名空间,那什么是命名空间呢?想像一下,比如一个年级的学生,在记录的时候出现了重名的情况,那么这个时候应该怎么记录呢,是不是需要加一些其它的名称,比如,一三班小李同学,一一班小李......
  • C++信奥老师解一本通题 1370:最小函数值(minval)
    ​【题目描述】有n个函数,分别为F1,F2,...,Fn。定义Fi(x)=Ai*x*x+Bi*x+Ci(x∈N∗)。给定这些Ai、Bi和Ci,请求出所有函数的所有函数值中最小的mm个(如有重复的要输出多个)。【输入】第一行输入两个正整数n和m。以下nn行每行三个正整数,其中第ii行的三个数分别位Ai、Bi和Ci输入数......
  • C++:多态
    目录一.多态的概念二.多态的定义及其实现1.虚函数2.虚函数的重写/覆盖3.实现多态的条件 4.虚函数重写的例外5.析构函数的重写6.经典例题7.C++11override和final关键字8.重载、重写/覆盖、隐藏的区别三.抽象类四.多态的原理1.虚函数表指针2.多态如何实现3.动态......
  • C++面试考点:拷贝赋值运算符和拷贝构造函数有什么区别?
    定义和功能拷贝构造函数拷贝构造函数是一种特殊的构造函数,用于创建一个新对象,该新对象是作为另一个同类型对象的副本而创建的。其函数原型通常为类名(const类名&other)(在C++11之前,const也可省略)。例如:classMyClass{public:MyClass(constMyClass&ot......
  • C++11 线程同步接口std::condition_variable和std::future的简单使用sk
    合集-C++(1)1.C++11线程同步接口std::condition_variable和std::future的简单使用09-17收起std::condition_variable条件变量std::condition_variable有wait和notify接口用于线程间的同步。如下图所示,Thread2阻塞在wait接口,Thread1通过notify接口通知Thread2继续执行。......
  • 信息学奥赛c++语言:求整数的和与均值
    题目描述读入n(1≤n≤10000)个整数,求它们的和与均值。输入输入第一行是一个整数n,表示有n个整数。第2~n+1行每行包含1个整数。每个整数的绝对值均不超过10000。输出输出一行,先输出和,再输出平均值(保留到小数点后5位),两个数间用单个空格分隔。样例输入 4344222343222......
  • C++实现redis分布式锁
    实现Redis分布式锁在C++中通常涉及到使用Redis客户端库来与Redis服务器通信。下面是一个简单的例子,展示如何使用C++和Redis实现一个基于Redis的分布式锁。首先,你需要安装一个支持Redis的C++客户端库。例如,可以使用`lib_redis`或者`cpp-redis`等库。这里我将提供一个伪代码级别......
  • C/C++笔记
    C/CPP笔记杂记structmsg_train和typedefstructmsg_train大小不一样cstdio和stdio#include<stdio.h>intmain(){printf("Hello,World!\n");return0;}#include<cstdio>intmain(){std::printf("Hello,World!\n"......
  • C++11 线程同步接口std::condition_variable和std::future的简单使用
    std::condition_variable条件变量std::condition_variable有wait和notify接口用于线程间的同步。如下图所示,Thread2阻塞在wait接口,Thread1通过notify接口通知Thread2继续执行。具体参见示例代码:#include<iostream>#include<mutex>#include<thread>#include<queue>std......
  • 3295:【例50.1】陶陶摘苹果(C、C++、python)
    3295:【例50.1】陶陶摘苹果信息学奥赛一本通-编程启蒙(C++版)在线评测系统[例50.1]陶陶摘苹果1930:【05NOIP普及组】陶陶摘苹果信息学奥赛一本通(C++版)在线评测系统陶陶摘苹果(非数组版)陶陶摘苹果(非数组版)_哔哩哔哩_bilibili陶陶摘苹果(非数组版)_哔哩哔哩_bilibili......