c++学习笔记之封装篇(上)
title: c++学习笔记之封装篇(上)
date: 2017-03-12 18:59:01
tags: [c++,c,封装,类]
categories: [学习,程序员,c/c++]
一、类对象
假设我们由Tv这个类,定义如下
注意class结尾要加上分号
class Tv()
{
int width;
int height;
int volume;
void changeVolume()
{
//changeVolume
}
};
类的实例化有两种方法,一种是栈中实例化。另一种则是堆中实例化。
而这两种方法除了在用法上有区别以外(区别见下面代码),内存管理也有区别(栈不用考虑内存回收问题,系统会自动回收,而堆则需要程序员主动释放内存)。
1.实例化
- 从栈中实例化对象
Tv tv;
或者
Tv tv[20] //实例化对象数组 从栈中实例化系统自动回收内存
- 从堆中实例化对象
实例化一个对象后还需要判断是否成功申请到内存
Tv *p = new Tv();
Tv *q = new Tv[20]; //开辟一块对象内存
if(p==NULL)
{
cout<<"类实例化失败"<<endl;
}
//从堆中实例化数组对象,需要程序员回收
delete p;
delete[]q;
p = NULL;
q =NULL;
访问数据
- 通过栈实例化的对象访问数据成员:
tv.volume = 5;
tv.changeVolume();
- 通过堆实例化的对象访问数据成员:
tv->volume = 5;
tv->changeVolume();
二、string
可以很方便的定义一个字符串,而不再是使用麻烦的char[].
使用方法:
// 引入string头文件
#include <string>
初始化方法
注意:第4个初始化方法中的第二个参数只能是一个字符,不能是字符串。

常用操作

对于字符串相加操作,需要注意一点,不能直接使用两个字符串相加,中间必须得有字符串变量连接才行(下面例子中最后一个赋值语句是错误的),具体例子如下:

另外如果要将字符串和整数连在一起输出,则需要在整数前加上 << 进行处理,直接用 “+” 是无效的。
string name;
cin>>name;
cout<<name<<name.size()<<endl;
三、构造函数
- 构造函数必须与类同名,起到的作用与python中的 _ init > _() 函数类似,即对类进行数据初始化。
- 构造函数在对象实例化时被自动调用,且只调用一次。
- 构造函数没有返回值,不需要return值。
- 构造函数可以重载。
1. 构造函数分为有参与无参
举个栗子:
class Student
{
// 无参构造函数
Student()
{
m_iHeight = 180;
m_iWeight = 70;
}
// 有参构造函数
Student(int weight, int height)
{
m_iWeight = weight;
m_iHeight = height;
}
private:
int m_iWeight;
int m_iHeight;
}
2. 构造函数初始化列表
在初始化对象时,初始化列表是最先执行的,所以有的时候对于const变量我们也可以提前赋值。
语法:
类名():变量1(参数),变量2(参数){}
用法:
我们都知道一个人的身份证信息一般来说是不能随意篡改的,所以我们会使用const 来修饰,但是因为const修饰后,变量则不能再赋值,但是因为每个人的身份证又不一样,我们不可能在使用const修饰的同时进行赋值,那怎么办呢?所以这里用到了初始化列表来达到这么一个效果,详见下面的代码示例:
class Student
{
// 正确示例
// 初始化列表
Student(string id):m_iId(id)
{
// 初始化成功
}
// 编译会报错
// Student(string id)
// {
// m_iId = id;
// }
private:
const string m_iId;
}
初始化类数组
Coordinate *coorArr = new Coordinate[2]{{1,2},{3,4}};
具体示例
#include <iostream>
using namespace std;
class Coordinate
{
public:
Coordinate(int x,int y):m_iX(x),m_iY(y)
{
cout<<m_iX<<","<<m_iY<<endl;
}
// 打印坐标的函数
void printInfo()
{
cout<<m_iX<<","<<m_iY<<endl;
}
private:
int m_iX;
int m_iY;
};
int main(void)
{
//定义对象数组
Coordinate *coorArr = new Coordinate[2]{{1,2},{3,4}};
//遍历数组,打印对象信息
for(int i = 0; i < 2; i++)
{
coorArr[i].printInfo();
}
return 0;
}
3. 拷贝构造函数
- 不能重载
格式:
类名(const 类名& 变量名)
关于拷贝构造函数更具体的解析参考:
C++拷贝构造函数详解
4.析构函数
与构造函数相反,当一个对象的生命周期结束时,C++会自动调用一个特殊的成员函数,即析构函数进行善后工作,对成员变量所占内存进行释放操作。
格式:(不需要参数)
~类名(){}
class Student
{
// 构造函数,初始化列表
Student():m_iId(110){};
// 析构函数,c++可以自动生成
~Student(){};
}
对象的生命历程:
申请内存-->初始化列表-->构造函数-->参与运算-->析构函数-->释放内存

c++学习笔记之封装篇(上)的更多相关文章
- 6-C++远征之封装篇[上]-学习笔记
C++远征之封装篇(上) 课程简介 类(抽象概念),对象(真实具体) 配角: 数据成员和成员函数(构成了精彩而完整的类) 构造函数 & 析构函数(描述了对象的生生死死) 对象复制和对象赋值 ( ...
- Spring源码学习笔记12——总结篇,IOC,Bean的生命周期,三大扩展点
Spring源码学习笔记12--总结篇,IOC,Bean的生命周期,三大扩展点 参考了Spring 官网文档 https://docs.spring.io/spring-framework/docs/ ...
- JVM学习笔记——内存模型篇
JVM学习笔记--内存模型篇 在本系列内容中我们会对JVM做一个系统的学习,本片将会介绍JVM的内存模型部分 我们会分为以下几部分进行介绍: 内存模型 乐观锁与悲观锁 synchronized优化 内 ...
- Noah的学习笔记之Python篇:装饰器
Noah的学习笔记之Python篇: 1.装饰器 2.函数“可变长参数” 3.命令行解析 注:本文全原创,作者:Noah Zhang (http://www.cnblogs.com/noahzn/) ...
- ASP.NET Core Web开发学习笔记-1介绍篇
ASP.NET Core Web开发学习笔记-1介绍篇 给大家说声报歉,从2012年个人情感破裂的那一天,本人的51CTO,CnBlogs,Csdn,QQ,Weboo就再也没有更新过.踏实的生活(曾辞 ...
- OracleDesigner学习笔记1――安装篇
OracleDesigner学习笔记1――安装篇 QQ:King MSN:qiutianwh@msn.com Email:qqking@gmail.com 一. 前言 Oracle是当 ...
- Nginx学习笔记之加强篇
在上一篇文章Nginx学习笔记之应用篇中,我们已经可以正式运行自己的网站了.但是在使用Nginx服务器时还需要注意几个问题: 1.Nginx服务器上配置的单个站点的并发量不超过1024 2.Nginx ...
- Nginx 学习笔记之安装篇
在windows下安装Nginx其实非常简单,只需如下几个步骤: 1. 在Nginx官网下载相应版本的安装程序,上面有最新版.稳定版等各种版本,正式运营的项目建议下载最新的稳定版 2.将下载后的压缩包 ...
- Python学习笔记之基础篇(-)python介绍与安装
Python学习笔记之基础篇(-)初识python Python的理念:崇尚优美.清晰.简单,是一个优秀并广泛使用的语言. python的历史: 1989年,为了打发圣诞节假期,作者Guido开始写P ...
随机推荐
- react native 运行项目下载gradle慢的解决办法
react-native run-android 慢 React-native run-Android中需要下载https://services.gradle.org/distributions/gr ...
- 对于Java泛型的理解
源起:查看COLLECIOTNS类 Q1:为什么java需要泛型? 因为java对于对象类型的确认在编译期,那么强制类型转换就可以通过编译,但是运行时的错误却无法避免,那么泛型的存在可以避免强制类型转 ...
- C++中将string类型转化为int类型
写程序需要将string转化为int,所以就探索了一下. 方法一:atoi函数 atoi函数将字符串转化为整数,注意需要stdlib库.所以就尝试了一下: #include <iostream& ...
- asp.net core mvc剖析:路由
在mvc框架中,任何一个动作请求都会被映射到具体控制器中的方法上,那框架是如何完成这样一个过程的,现在我们就来简单分析下流程. 我们紧跟上面的主题,任何一个请求都会交给处理管道进行处理,那mvc处理的 ...
- framework各版本新特性(为面试准备)
菜鸟D估计描述这些新特性的文章都是烂大街的货色,之所以拿出来分(e)享(xin)一下,有两个原因:1.当年面试的时候有人问到,我不知道该怎么回答:2.项目需要发布了,但是考虑到framework的版本 ...
- wikioi 3132 高精度乘法(FFT)
第一次学FFT,先膜拜一下法法塔大神ORZ 关于FFT的话,有一篇博文特别赞http://z55250825.blog.163.com/blog/static/15023080920143127465 ...
- 2013~2014年度 NOIP~GDOI总结
滚回去撸一年中考撸完之后就迎来了NOIP2013(话说初赛差点被坑了有木有= =)想想当年10月还是那样的天真的去了广州,结果就被虐成翔的回来了= =只做了三道签到题的渣渣就是弱= =DAY1T2死活 ...
- centos 安装gcc->联网 问题解决
本篇部分摘抄至TD_时缔 VMware虚拟机下安装centosmini版本,安装后第一件事就是yum update 但是有错:cannot find a valid baseurl for repo ...
- Pin学习笔记--安装及一些基本知识
具体请见用户手册Pin 3.2 User Guide https://software.intel.com/sites/landingpage/pintool/docs/81205/Pin/html/ ...
- C# Windows 异步线程
Task t = new Task(new Action(() => { //推送产品 ...