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构建淘票票webapp,及react与vue的简单比较。
前言 前段时间使用vue2.0构建了淘票票页面,并写了一篇相关文章vue2.0构建淘票票webapp,得到了很多童鞋的支持,因此这些天又使用react重构了下这个项目,目的无他,只为了学习和共同进步! ...
- 简易封装手机浏览器touch事件
做手机开发时候,简单想用一些动作,如touchLeft,touchRight等, 使用其他库文件就要加载很多不必要的东西,流量的浪费 今天简单写了封装touch的库,简单的监听一些逻辑 onTouch ...
- 纯js实现html转pdf
项目开发中遇到了一个变态需求,需要把一整个页面导出为pdf格式,而且要保留页面上的所有的表格.svg图片和样式.简而言之,就是希望像截图一样,把整个页面截下来,然后保存成pdf.咋不上天呢--查了一下 ...
- Redis的二八定律
常用命令: 1.setex key 有效时间 value ----------意思就是添加并设置该键值对的存活时间 2.mset key1 value1 key2 value2 key3 value3 ...
- php常见面试问题
1. 如果没有开启cookies,session如何工作? PHP中的sessions通常会使用cookies的方法.但是如果没有cookies(浏览器禁用cookies),PHP sessions也 ...
- CentOS安装Tomcat8
安装环境:CentOS-6.5 安装方式:源码安装 软件:apache-tomcat-8.0.0.RC3.tar.gz 下载地址:http://tomcat.apache.org/download-8 ...
- 快看我解决了一个Nginx的小问题
前言 最近小编写项目的时候,需要用到Nginx服务器,对于Nginx正常安装就好了详情见[我是传送门],正当一切安好的时候问题来了,这台服务器的80端口竟然被占用了,什么鬼?怎么办,只有改端口.具体方 ...
- JS事件绑定深入
W3C很好地解决了覆盖问题.相同函数屏蔽的问题.this传递问题.添加额外方法不被覆盖等问题. 但是IE8之前的版本并不支持,IE9已完全支持了. IE和W3C在事件绑定上存在很多差异,我们以冒泡和捕 ...
- 每天一个linux命令(43)--netstat命令
netstat 命令用于显示与 IP TCP UDP 和 ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况.netstat 是在内核中访问网络及相关信息的程序,它能提供TCP连接,T ...
- RAC之常用方法-----新手入门
年后换工作新入职,公司开发在使用RAC,之前居然一直没有了解过,独立开发的弊端,信息闭塞,而且自己也懒,这几天看了下RAC,确实很强大有木有. 什么是ARC 简单的说,RAC就是一个第三方库,他可以大 ...