笨蛋学c++——day01

hi,这里是一个笨蛋在为复试准备c++的学习。
今天才开始,三月底可能要复试啦所以还是蛮紧张的。参考用书是郑莉老师的《c++语言程序设计》.
之前学习过一点点点的Java,大概就到面向对象。前面的c语言至少语法比较熟练了,所以就从c++的面向对象开始学起,笔记可能比较乱,偏自用一点,加油啦!

day01

类与对象主线内容

#include<iostream>
using namespace std;

class Clock{
	public:
		void setTime(int newH=0,int newM=0,int newS=0);
		void showTime();
	private:
		int hour,minute,second;
};

int main(){
	Clock myClock;
	cout<<"First time set and output:"<<endl;
	myClock.setTime(0);
	myClock.showTime();
	cout<<"Second time set and output:"<<endl;
	myClock.setTime(23,59,30);
	myClock.showTime(); 
	return 0;
} 

属性与方法的创建

class Clock{
	public:
		void setTime(int newH=0,int newM=0,int newS=0);
		void showTime();
	private:
		int hour,minute,second;
};

使用class 类名{
类内结构
};
来声明一个自定义类,其中可以包括一些特有的属性,例如时钟类的hour、minute、second等;也有一些函数,例如setTime()、showTime()等;
属性与函数的声明与之前在main函数中并无两样,不作详细叙述。

成员函数的实现

#include<iostream>
using namespace std;

class Clock{
	public:
		void setTime(int newH=0,int newM=0,int newS=0);
		//类内实现(隐式声明)
		void showTime(){	
		cout<<hour<<":"<<minute<<":"<<second<<endl;
	}
	private:
		int hour,minute,second;
};
//类外实现(显式声明)
void Clock::setTime(int newH,int newM,int newS){
	hour = newH;
	minute = newM;
	second = newS;
}

这种被称为内联成员函数,大概就是自己家里人的意思。
成员函数的实现可以在类外,用【返回值 类名::成员函数(参数列表)】的方式实现,表明“哪个类的哪个函数需要什么参数,实现了什么功能最后返回什么类型”的意思。
同样也可以在类内进行实现,因不用指明是“哪个类”,因此省略【类名::】,
因声明在类的内部,是自己家里人,因此可以使用类内的所有属性和函数,无论是private还是public都可以。

对象的创建

以前我们会自己创造变量,例如int x = 10;那么int是类型,x是变量名,10是赋值。
现在我们自己创建了类,如果将上面的代码泛化,那么int是“整型类”,x是“整形类的对象”,10是“初始值”。
明白了这个原理,我们就可以用我们的自定义的类造对象了。

	Clock myClock;		//创建对象

因为myClock这个对象里包含许多结构,不能像int x =10;这样简单的赋值,应对其每个属性进行初始化。

	myClock.hour = 2;
	myClock.minute = 30;
	myClock.second = 56;

若是在非private的情况下,可以直接通过对象.属性或者对象.函数的方式访问类内属性、函数,并随意修改。但是因为权限的影响(后会说),因此类外无法访问被设置为private的部分。因此我们一般会设置public的get、set方法对类内变量进行赋值和读取。

	myClock.setTime(23,59,30);
	myClock.showTime(); 

或者初始化时也可以使用下面提到的构造函数

构造函数

“创建一个对象”这个工作是谁来完成的呢?
在Java中叫做构造器,在c++中叫做构造函数。
对象必须初始化。就像定义了一个int型的变量x,不初始化直接输出x,则会得到一堆无用的数据,对象也一样,构造函数是其中一种方法,它可以在创建对象的同时负责初始化。
为什么刚才的程序中没有写构造函数也可以创建对象呢?
因为系统默认提供了一个空参的构造函数,没有参数也不做其他的事情,仅是创建对象

	public:
		Clock(){}
构造函数的声明及实现

同样可以分为显式和隐式,构造函数的名称与类名一致,可以声明多个构造函数,它们彼此之间构成重载。

class Clock{
	public:
			Clock(){}			//类内实现
			Clock(int newH,int newM,int newS);
}
Clock::Clock(int newH,int newM,int newS){	//类外实现
	hour = newH;
	minute = newM;
	second = newS;
}

创建对象时只需要使用【类名 变量名(构造函数参数)】的方式即可调用,若为无参,则不用写括号。

	Clock myClock(2,30,56);
复制构造函数

有时候我们的需求不是手动赋值,而是把一个已经创建好赋值完的对象传进去,要求返回一个一样的对象(这里的一样其实也不是一模一样,两个不是一个对象,只是内部属性值相等)
与内敛成员函数的声明与实现一模一样,可类内可类外,不再赘述,注意参数列表中需要传入对象的地址值,即需要使用“&”!

Clock(Clock &myclock){
			this->hour = myclock.hour;
			this->minute = myclock.minute;
			this->second = myclock.second;
		}

调用该函数时需要注意,只能在声明时调用(因为是赋值构造函数本质是构造函数而不是普通函数),且以下情况均会调用该构造函数。

	Clock myClock1(myClock);
	Clock myClock2 = myClock;

另外,在形参是Clock类、返回值是Clock类型时均会调用,详见郑莉老师教材P111.

析构函数

对象用完就会被清理,析构函数用来做一些清理前的扫尾工作,释放一些资源。析构函数不接受任何参数(但可以是虚函数),且自动被调用,默认是无参的函数。

		~Clock(){
			cout<<"对象已被销毁"<<endl; 
		}

类的组合

类内部有许多种类的变量,有时候可能是另一个自定义类。

组合类构造函数

组合类的构造函数实现方法为【类名::类名(参数列表):内嵌对象1(参数列表),内嵌对象2(参数列表)】{类的初始化}
用刚才的例子来表示就是

Clock::Clock(int h,int m,int s):hour(h),minute(m),second(s){
	cout<<"对象已创建,且初始化"<<endl;
}

此时编译器提示我Clock(int,int,int)已经创建,而之前我已经写过了三个参数的构造函数,说明组合构造函数本质上还是构造函数,不可以重复声明。

向前引用声明

有时候,我们也会遇到类的内部定义了其他类的情况,这没什么,但是如果相互引用,那么谁都没有加载的话,编译就过不去。

class A{
	public:
		void f(B b);	//A类加载完成的前提是B类先加载

};
class B{
	public:
		void f(A a);	//B类加载完成的前提是A类先加载
};

这样就死锁了,为了避免这种情况,可以在A类声明前加入B的声明

class B; 
class A{
	public:
		void f(B b);	//A类加载完成的前提是B类先加载

};

class B{
	public:
		void f(A a);	//B类加载完成的前提是A类先加载
};

特别说明:对象不适用,以下是错误代码。

class B; 
class A{
	B b;
};
class B{
	A a;
};

今天份先到这里了,后面去做做练习或者组织一下下一篇。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值