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

C++基础回顾(二)

2018-01-19 22:23 465 查看

看视频课程:C++面向对象编程

第8节面向对象基础



第9节定义类和对象





struct  与 class 在C++中都可以定义类,struct默认为public,而class默认为private。

成员函数申明与定义的两种方式:
1.类内定义,类内实现,print()函数
2.类内定义,类外实现,getAge()函数
这里,第一种类内定义的默认为内联函数,类外定义的要手动添加inline!



第10节类和对象的使用



/*Student stu;
stu.print();
cout<<stu.getAge()<<endl;*/

/*Student stu;
Student *p = &stu;
p->print();
cout<<p->getAge()<<endl;*/

Student stu;
Student &s = stu;
s.print();
cout<<s.getAge()<<endl;


//使用宏指令,防止重复定义
#ifndef TIME_H
#define TIME_H
//...
#endif

头文件Time.h

#ifndef TIME_H
#define TIME_H
class CTime
{
public:
void setHour(int hour);
void setMinute(int minute);
void setSecond(int second);

int getHour();
int getMinute();
int getSecond();
private:
int m_nHour;
int m_nMinute;
int m_nSecond;
};
#endif


cpp文件Time.cpp
#include "Time.h"

void CTime::setHour(int hour)
{
m_nHour = hour;
}
vo
4000
id CTime::setMinute(int minute)
{
m_nMinute = minute;
}
void CTime::setSecond(int second)
{
m_nSecond = second;
}

int CTime::getHour()
{
return m_nHour;
}
int CTime::getMinute()
{
return m_nMinute;
}
int CTime::getSecond()
{
return m_nSecond;
}

运行文件main.cpp
#include<iostream>
#include"Time.h"
using namespace std;

int main()
{
CTime time;
time.setHour(10);
time.setMinute(50);
time.setSecond(20);

cout<<time.getHour()<<":"<<time.getMinute()<<":"<<time.getSecond()<<endl;
return 0;
}

Visual Studio 2012常用快捷键总结

1)注释:组合键“Ctrl+K+C”;

2)取消注释:组合键“Ctrl+K+U”。

第11节构造函数和析构函数



CTime::CTime()    //默认构造函数
{
m_nHour = 0;
m_nMinute = 0;
m_nSecond = 0;
}

CTime::~CTime()   //析构函数
{
std::cout<<"~CTime"<<std::endl;
std::cout << "Object is being deleted" << std::endl;
}

CTime::CTime(int value)      //带一个参数的构造函数
{
m_nHour = value;
m_nMinute = value;
m_nSecond = value;
}

CTime::CTime(int hour, int minute, int second)
{
m_nHour = hour;
m_nMinute = minute;
m_nSecond = second;
}
没有构造函数时会提供默认不带参的构造函数,有构造函数时就不会提供默认构造函数了!
注意一下,默认参数构造函数,不能给所有参数提供默认值,这样可能会导致歧义!

第12节this指针和复制构造函数



复制构造函数也是构造函数的一种,有了复制构造函数就不会有默认的构造函数了



this指针:
void CTime::setMinute(int minute)
{
m_nMinute = minute;    //this指针隐藏
//this->m_nMinute = minute;       //->方式
//(*this).m_nMinute = minute;     //.方式,this是指针,*this是对象
}

复制构造函数:
CTime::CTime(CTime& time)
{
m_nHour = time.m_nHour;
m_nMinute = time.m_nMinute;
m_nSecond = time.m_nSecond;
cout<<"Copy constructor!"<<endl;
}
//1.以其对象作为参数创建新对象时
CTime time5(time);
//2.类对象(传值)作为函数参数时
void func1(CTime time)
{
 cout<<time.getHour();
}
//3.类对象作为参数返回值时
/*CTime func1(CTime time)
{
cout<<time.getHour();
return time;
}*/
//应该为引用的方式返回,较少复制产生花销,注意不能返回局部变量的引用:
CTime& func1(CTime& time)
{
cout<<time.getHour();
return time;
}

第14节const对象和const成员



const数据成员,不能在构造函数里赋值,只能通过初始化列表初始化,且每个构造函数要用初始化列表对其进行初始化。
初始化列表形式如下:a(1),b(2)
CTime::CTime()
:m_nNum(10)
{
m_nHour = 0;
m_nMinute = 0;
m_nSecond = 0;
//这样编译不通过
//m_nNum = 0;
}
CTime::CTime(int value)
:m_nNum(20)
{
m_nHour = value;
m_nMinute = value;
m_nSecond = value;
}
CTime::CTime(int hour, int minute, int second)
:m_nNum(1)
{
m_nHour = hour;
m_nMinute = minute;
m_nSecond = second;
}
CTime::CTime(CTime& time)
:m_nNum(time.m_nNum)
{
m_nHour = time.m_nHour;
m_nMinute = time.m_nMinute;
m_nSecond = time.m_nSecond;
cout<<"Copy constructor!"<<endl;
}
//const数据成员
const int m_nNum;
//const成员函数
int getNum()const;
int CTime::getNum()const{return m_nNum;}
//const对象time和time2
const CTime time(10, 50, 20);
CTime const time2(12, 20, 12);
/*const对象不能调用非const类型的成员函数
time.getHour();
time2.setHour();*/
cout<<time.getNum()<<endl;

第15节友元



1.将非成员函数声明为友元:
在CTime类的头文件Time.h中添加,友元函数,要访问CTime类的私有数据成员
//将非成员函数声明为友元函数
friend void func();

void func()
{
CTime time(1,1,1);
cout<<time.m_nHour<<endl;
time.m_nHour = 3;
cout<<time.m_nHour<<endl;
}

2.友元类、其他类的成员函数声明为友元函数

注意一下友元类的声明位置与其他类声明为友元函数时的声明位置,实例如下:
CDate类要访问CTime类的私有成员,即在CTime类的头文件Time.h中添加,友元类或友元函数
//友元类
//friend CDate;
//友元函数即可
friend void CDate::display(const CTime& time);
Date.h文件
#ifndef DATE_H
#define DATE_H

//类前置声明
class CTime;
class CDate
{
public:
//构造函数
CDate(int year, int month, int day);

//友元类,不能索取,只能给与,所以应该在CTime类中声明友元类CDate
//friend CTime;
void display(const CTime& time);
private:
int m_nYear;
int m_nMonth;
int m_nDay;
};
#endif
Date.cpp
#include"Date.h"
#include"Time.h"
#include<iostream>

CDate::CDate(int year, int month, int day)
:m_nYear(year), m_nMonth(month), m_nDay(day)
{
}
void CDate::display(const CTime& time)
{
std::cout<<m_nYear<<"-"<<m_nMonth<<"-"<<m_nDay<<" "<<time.m_nHour<<":"<<time.m_nMinute<<":"<<time.m_nSecond<<std::endl;
}
main.cpp

const CTime time(10, 50, 20);
CDate date(2018,1,22);
date.display(time);


第16节运算符重载基础



1.一般的函数(加法运算,两个参数)
CTime operator+(CTime& time1, CTime& time2)
{
int nHour = 0, nMinute = 0;
int nSecond = time1.m_nSecond + time2.m_nSecond;
if(nSecond > 60)
{
nMinute ++;
nSecond -= 60;
}
nMinute += (time1.m_nMinute + time2.m_nMinute);
if(nMinute > 60)
{
nHour ++;
nMinute -= 60;
}
nHour += (time1.m_nHour + time2.m_nHour);
if(nHour > 24)
{
nHour -= 24;
}
//构造临时CTime对象
return CTime(nHour, nMinute, nSecond);
}
2.类的成员函数(加法运算,一个参数)
CTime CTime::operator+(CTime& time)
{
int nHour = 0, nMinute = 0;
int nSecond = this->m_nSecond + time.m_nSecond;
if(nSecond > 60)
{
nMinute ++;
nSecond -= 60;
}
nMinute += (this->m_nMinute + time.m_nMinute);
if(nMinute > 60)
{
nHour ++;
nMinute -= 60;
}
nHour += (this->m_nHour + time.m_nHour);
if(nHour > 24)
{
nHour -= 24;
}
//构造临时CTime对象
return CTime(nHour, nMinute, nSecond);
}

第17节运算符重载规则



CTime& CTime::operator=(CTime& time)
{
//判断是否为同一个对象,是一个则返回该对象(*this)
if(this == &time)
{
return *this;
}
m_nHour = time.m_nHour;
m_nMinute = time.m_nMinute;
m_nSecond = time.m_nSecond;

return *this;
}

//调用类的赋值运算函数
time = time3;
cout<<time.getHour()<<":"<<time.getMinute()<<":"<<time.getSecond()<<endl;

//调用复制构造函数
CTime time4 = time3;
CTime time5(time3);
需要将以上两者进行区分,容易混淆!!



第18节重载二元和一元运算符



==与>运算符重载
bool CTime::operator==(CTime& time)
{
if(m_nHour == time.m_nHour && m_nMinute == time.m_nMinute && m_nSecond == time.m_nSecond)
{
return true;
}
return false;
}

bool CTime::operator>(CTime& time)
{
if(m_nHour > time.m_nHour)
{
return true;
}
else if(m_nHour < time.m_nHour)
{
return false;
}
else
{
if(m_nMinute > time.m_nMinute)
{
return true;
}
else if(m_nMinute < time.m_nMinute)
{
return false;
}
else
{
if(m_nSecond > time.m_nSecond)
{
return true;
}
else
{
return false;
}
}
}
return false;
}
bool bRet = time == time2;
bool bRet2 = time > time2;




前置++与后置++运算符重载,前置无参数,后置参数(int)
CTime CTime::operator++()
{
//可以写个函数实现++,更方便的是使用加法的重载函数
//定义time对象(0,0,1)加到当前对象(*this)
CTime time(0, 0, 1);
*this = *this + time;
return *this;
}

CTime CTime::operator++(int)
{
//要返回++前的对象,赋值给time
CTime time = *this;
//可以写个函数实现++,更方便的是使用加法的重载函数
//定义time对象(0,0,1)加到当前对象(*this)
CTime time2(0, 0, 1);
*this = *this + time2;
return time;
}
++time2;
cout<<time2.getHour()<<":"<<time2.getMinute()<<":"<<time2.getSecond()<<endl;
time = time2++;
cout<<time.getHour()<<":"<<time.getMinute()<<":"<<time.getSecond()<<endl;
cout<<time2.getHour()<<":"<<time2.getMinute()<<":"<<time2.getSecond()<<endl;


第19节流插入、提取运算符和类型转换



//流提取>>运算符重载,作为友元函数,不能作为成员函数
istream& operator>>(istream& input, CTime& time)
{
cin>>time.m_nHour>>time.m_nMinute>>time.m_nSecond;
return input;
}
//流插入<<运算符重载,作为友元函数,不能作为成员函数
ostream& operator<<(ostream& output, CTime& time)
{
cout<<time.getHour()<<":"<<time.getMinute()<<":"<<time.getSecond()<<endl;
return output;
}

CTime time2(12);
cin>>time1;
cout<<time1<<endl<<time2<<endl;




1.使用构造函数进行类型转换
CTime time2(12);
time2 + CTime(3);
CTime time3(20);
CTime time4 = 20;
CTime time5 = CTime(20);
有了转换构造函数,以上都不会编译报错,然而:
//具有一个参数的构造函数可以用来做类型转换————称为转换构造函数
//有人说这样方便,也有不同意的人
//通过加关键字explicit,可以防止类型转换
explicit CTime(int value);
2.类型转换函数进行类型转换(不常见)
//类型转换函数,CTime对象转换为int类型
CTime::operator int()
{
return m_nHour * 60 * 60 + m_nMinute * 60 + m_nSecond;
}
CTime time(10,50,20)
int nSecond = time;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: