C++学习 Day.5(进入正轨~~)
类和对象:
1.声明类
class Human
{
// Member attributes:
string name;
string dateOfBirth;
string placeOfBirth;
string gender;
// Member functions:
void Talk(string textToTalk);
void IntroduceSelf();
...
};
我们也可以使用new来为对象动态的申请内存。
Human* firstWoman = new Human(); // dynamically allocated Human
delete firstWoman; // de-allocating memory
注:即Human是申明的类,其firstWoman是对象
firstMan.dateOfBirth = "1970";
firstMan.IntroduceSelf();
如果有一个指针 firstWoman,它指向 Human 类的一个实例,则可使用指针运算符(->)来访问成员(这将在下一小节介绍),也可使用间接运算符(*)来获取对象,再使用句点运算符来访问成员:
Human* firstWoman = new Human();
(*firstWoman).IntroduceSelf();
总的来说和结构体长得差不多的,目前而言。
关键字:public和private
样例(没有默认构造函数的类):
#include<iostream>
#include<string>
#include<algorithm>
#include<vector>
using namespace std;class Human {private:int age;string name;public:int GetAge(){return age;}void SetAge(int humansAge){if(humansAge>0)age=humansAge;//避免被设置为0}
};
int main(void) {Human eve;eve.SetAge(16);cout<<eve.GetAge();//cout<<eve.age //don't be allowedreturn 0;
}
同样,我们可以简单更改程序,使得其输出更小的年龄。
之所以我们可以达成这一目的,是由于age被声明在private中,不能直接访问它,只能通过GetAge方法进行访问。
在面向对象编程语言中,抽象是一个非常重要的概念,让程序员能够决定哪些属性只能让类及其成员知道,类外的任何人都不能访问(友元除外)
构造函数:
1.声明和实现构造函数
似于下面这样:
class Human
{
public:
Human(); // declaration of a constructor
};
码类似于下面这样:
class Human
{
public:
Human()
{
// constructor code here
}
};
在类声明外定义构造函数的代码类似于下面这样:
class Human
{
public:
Human(); // constructor declaration
};
// constructor implementation (definition)
Human::Human()
{
// constructor code here
}
注::被称为作用域解析运算符。例如,Human::dateOfBirth 指的是在 Human 类中声明的变量 dateOfBirth,而::dateOfBirth 表示全局作用域中的变量 dateOfBirth。
何时,如何使用构造函数及重载构造函数:
构造函数的使用代码举例:
#include<iostream>
#include<string>
using namespace std;class Human {private:int age;//init 0string name;public:Human(){age=0;cout<< "Default constructor: name and age not set."<<endl;} Human(string humansName,int humansAge){name=humansName;age=humansAge;cout<< "Overloaded constructor creates ";cout<<name<<" of "<<age<<" years."<<endl;}};
int main(void) {Human firstMan;Human firstWoman("ZHY",16);return 0;
}
Human(){age=0;cout<< "Default constructor: name and age not set."<<endl;}
带有默认值的构造函数:
class Human
{
private: string name; int age;
public: // overloaded constructor (no default constructor) Human(string humansName, int humansAge = 25) { name = humansName; age = humansAge; cout << "Overloaded constructor creates " << name; cout << " of age " << age << endl; } // ... other members
};
Human adam("Adam"); // adam.age is assigned a default value 25
Human eve("Eve", 18); // eve.age is assigned 18 as specified
注意:
class Human
{
private:
string name;
int age;
public:
// default values for both parameters
Human(string humansName = "Adam", int humansAge
= 25)
{name = humansName; age = humansAge; cout << "Overloaded constructor creates "; cout << name << " of age " << age; }
};
buffer:n. 缓冲物,起缓冲作用的人;缓冲器;缓存区;老糊涂 v. 保护,保障;缓存
析构函数:
在对象被销毁时自动调用,释放内存(在main函数之后)。
当然,析构函数还是比较困难的,在我们学习的初期,先对它进行了解即可,而无需深研。
class Human
{ ~Human(); // declaration of a destructor
};
在类中:
class Human
{
public: ~Human() { // destructor code here }
};
在类外:
class Human
{
public: ~Human(); // destructor declaration
};
// destructor definition (implementation)
Human::~Human()
{ // destructor code here
}
何时及如何使用析构函数
注:
腭化符号(~):main函数运行结束后,令之自动调用。
放松时刻:
#include<iostream>
#include<string>
using namespace std;class Human {private:int age;//init 0string name;public:Human(string humansName="Adam",int humansAge=25):name(humansName),age(humansAge){
// name=humansName;
// age=humansAge;cout<< "Overloaded constructor creates ";cout<<name<<" of "<<age<<" years."<<endl;}~Human(){cout<<"我啥也没做,哈哈哈"<<endl;}
};
int main(void) {Human adam;Human firstWoman("ZHY",16);cout<<"-------end of main------"<<endl;return 0;
}
continue:
复制构造函数:
浅复制带来的问题:
分析:
使用复制构造函数确保深复制
//深复制的代码
好了,我没写 ,原因如下:
寄,太难了,看不懂了,构造函数和析构函数的其他用途就不写了,蒟蒻感juo无能为力了。
往下走
this 指针
class Human
{
private: void Talk (string Statement) { cout << Statement; }
public: void IntroduceSelf() { Talk("Bla bla"); // same as Talk(this, "Bla Bla") }
};
void SetAge(int humansAge)
{ this->age = humansAge; // same as age = humansAge
}
将 sizeof( )用于类
结构和类的不同之处:
Human的struct实现:
struct Human
{ // constructor, public by default (as no access specified is mentioned) Human(const MyString& humansName, int humansAge, bool humansGender) : name(humansName), age (humansAge), Gender(humansGender) {}int GetAge () { return age; }
private: int age; bool gender; MyString name;
};
正如您看到的,结构 Human 与类 Human 很像;结构的实例化与类的实例化也很像:
Human firstMan("Adam", 25, true); // an instance of struct Human
声明友元
样例代码:
#include<iostream>
#include<string>
using namespace std;class Human {private:friend class Utility;int age;//init 0string name;public:Human(string humansName = "Adam", int humansAge = 25): name(humansName), age(humansAge) {
// name=humansName;
// age=humansAge;}
};class Utility {public:static void DisplayAge(const Human& person) {cout << person.age << endl;}
};int main(void) {Human firstMan("Adam", 25);cout << "Accessing private member age via friend class: ";Utility::DisplayAge(firstMan);//Utility这个类没有对象,所以我们直接使用它的DisplayAge函数return 0;
}
friend class Utility;
共用体:一种特殊的数据存储机制
共用体是一种特殊的类,每次只有一个非静态数据成员处于活动状态。因此,共用体与类一样,可包含多个数据成员,但不同的是只能使用其中的一个。
1.声明共用体
union UnionName
{ Type1 member1; Type2 member2;
…TypeN memberN;
};
实例化:
UnionName unionObject;
unionObject.member2 = value; // choose member2 as the active member
注:
2.何时使用共用体:
enum和switch-case一起用。
对类和结构使用聚合初始化
例1:
int myNums[] = { 9, 5, -1 }; // myNums is int[3]
char hello[6] = { 'h', 'e', 'l', 'l', 'o', ' \0' };
例2:
struct Aggregate1
{
int num;
double pi;
};
//可将其作为一个整体进行初始化
Aggregate1 a1{ 2017, 3.14 };
struct Aggregate2
{
int num;
char hello[6];
int impYears[5];
};
//对于这个结构,可像下面这样进行初始化:
Aggregate2 a2 {42, {'h', 'e', 'l', 'l', 'o'}, {1998, 2003, 2011, 2014, 2017}};
问:总是应该编写一个复制构造函数吗?答:如果类的数据成员是设计良好的智能指针、字符串类或 STL 容器(如 std::vector),则编译器生成的默认复制构造函数将调用成员的复制构造函数。然而,如果类包含原始指针成员(如使用 int*而不是 std::vector<int>表示的动态数组),则需要提供设计良好的复制构造函数,确保将类对象按值传递给函数时进行深复制,创建该数组的拷贝。
问:在复制构造函数中,为何将指向源对象的引用作为参数?答:这是编译器对复制构造函数的要求。其原因是,如果按值接受源对象,复制构造函数将调用自己,导致没完没了的复制循环。
今天结束了,寄几寄~~~
C++学习 Day.5(进入正轨~~)相关推荐
- 每周更新学习进度表--第九周
每周更新学习进度表: 学习时间 新增代码行 博客量(篇) 知识总结 第一周 7h 80 2 对于软件工程这门课有个大致的了解,并在学习代码上步入正轨. 第二周 8h 100 4 四 ...
- 我们如何学习:学会学习再学习
我们如何学习:学会学习再学习 学习方法:不同科目不同方法 人和人学习能力的差距在哪里? 快速学习:我不是会得多,只是学得快 学习动力:培养啥耐心呀,你真的有欲望要做的事,八头牛都拉不住你 激发好奇心: ...
- 我与我的专业计算机作文500字,我的学习生活作文500字(通用5篇)
我的学习生活作文500字(通用5篇) 导语:在日常学习.工作抑或是生活中,大家都尝试过写作文吧,作文要求篇章结构完整,一定要避免无结尾作文的出现.还是对作文一筹莫展吗?下面是小编为大家整理的我的学习生 ...
- 从凡人到筑基期的单片机学习之路
为防止读者误解,首先申明一点,我不是大佬,亦不是大神,只是众多单片机学习者中的一员而已.我写此文的目的主要是记录自己学习的过程,并借此为一些初学者提供部分参考,或许能让初学者少走一些弯路. 从小我对电 ...
- 英文学习法—-林语堂
1.目标 英文是活的语言,现代通用的语言.凡是学习英文的人务必认定这个目标,学习现代通行活用的英语.这个目标认定,方法才不会错误.若把英文看作死的,固定的语言,将来对于文法,读物,发音都要偏重于迂腐的 ...
- 第一次罗塞塔学习---收获总结
前言 感觉学习罗塞塔用了好长好长的时间啊,怎么就一直都点不完啊,刚开始看其他师哥师姐点的时候感觉这个东西真好玩,怎么到了自己点的时候,就感觉,天呢,这是我之前认识的罗塞塔嘛! 过程中 其实在点罗塞塔的 ...
- 期末总结---为本学期画上圆满的句号
期末总结---为本学期画上圆满的句号 记得开学第一节课,我们都对算法结构感到很疑惑,不知道这门课程是学什么的,直到第一节课,我们见到了老贺(感觉这样叫比较亲切),老师给我们详细的介绍了我们这节课主要学 ...
- 2w学费买来的英语学习方法
目录快速浏览: 1.培训机构的背后 2.那些恐怖的经历 3.对英语教学的质疑 4.重新思考,找到自我 1. 培训机构的背后 说起英语培训机构,当你百度一下时,发现全是各种黑,现在的英语培训机构几乎没有 ...
- 从校园到职场,谈谈我的转变
本文原发表地址:从校园到职场,谈谈我的转变 一.大学时光 时间回到2014年9月,从高中进入大学.这是我的第一次转变,尽管当时我不这么认为也意识不到这个转变.印象最为深刻的还是入学那一段时间,现在我都 ...
最新文章
- 面对大规模AI集成,企业为何迟迟犹豫?
- python的concat用法_Pandas串联操作concat()用法介绍
- 攻防世界-web-i-got-id-200-从0到1的解题历程writeup
- Android协程学习
- 打不开磁盘配额linux,九度OJ 1455 珍惜现在,感恩生活 -- 动态规划(背包问题)...
- anaconda安装python视频_怎么安装anaconda?
- 12-order by和group by 原理和优化 sort by 倒叙
- Pytorch —— 优化器Optimizer(二)
- vue2.0 + vux (六)NewsList 资讯页 及 NewsDetail 资讯详情页
- 如何在linux中也能够使用自动类型推导关键字auto?
- dtu连接mysql_数据中心使用dtu远程连接oracel 9i数据库问题
- 一维码二维码识别(opencv c++)
- OpenWrt设置路由器联网(无线)
- Telegram Download Default Chat Wallpaper
- 严寒冰 国家计算机网络,北京航空航天大学计算机学院——严寒冰
- flutter检测网络状态
- r语言c函数怎么用,R语言学习笔记——C#中如何使用R语言setwd()函数
- java.sql.SQLException: The server time zone value '???ú±ê×??±??' is unrecognized or represents 解决方法
- UVA10765 Doves and bombs(双连通分量)
- ad频谱分析 matlab_MATLAB信号频谱分析FFT详解
热门文章
- 如何使用DMA,包含源码以及详细注释
- mysql创建用户只能访问数据库中一张表
- html 设置图片左对齐,CSS设置图片的对齐
- 玩游戏掉帧严重?看过来!
- 铁路售票处实习记:买火车票须知
- 微信开发工具控制台报错 未找到入口 app.json文件?
- React 源码系列 | React Context 详解
- 平移计算机图形学代码注释,求代码注释:计算机图形学的OpenGL画四面体。高手来吧。争取每句都注释下。谢谢...
- MAC OS下设置bits/stdc++.h万能头文件
- 2022年Work-Life Balance能实现吗?