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 ...
随机推荐
- (@WhiteTaken)设计模式学习——单例模式
单例模式,个人理解就是,使用了这个模式,可以保证一个类只生成唯一的实例对象.就是在整个程序中,这个类只存在一个实例对象. GoF对单例模式的定义:保证一个类,只有一个实例存在,同时提供能对该实例加以访 ...
- Vuex核心知识(2.0)
Vuex 是一个专门为 Vue.js 应该程序开发的状态管理模式,它类似于 Redux 应用于 React 项目中,他们都是一种 Flux 架构.相比 Redux,Vuex 更简洁,学习成本更低.希望 ...
- windows下搭建Nexus3私服和基于IDEA15的Maven学习笔记
搭建Nexus私服. 首先去官网下载window下用的zip文件.https://www.sonatype.com/download-oss-sonatype. 解压之后包含下面两个文件 进入nexu ...
- 【Zookeeper】源码分析之请求处理链(一)
一.前言 前面已经分析了Watcher机制的主要代码,现在接着分析Zookeeper中的请求处理链,其是Zookeeper的主要特点之一. 二.总体框图 对于请求处理链而言,所有请求处理器的父接口为R ...
- JUnit与JMock学习
JUnit与JMock学习 测试驱动编程和持续集成部署应该说是现在软件开发者的必备武器,不过跟其他很多好东西一样,在我们公司的推广总要慢上一拍,毕竟老板看的是你能够把功能实现好让客户满意,所以能不折腾 ...
- DirectX11中Shader的封装
引言 这个寒假学DirectX11的时候用的书是<Introduction to 3D Game Programming with DirectX 11>,里面关于Shader的部分全 ...
- Redis参数配置和运维说明
开发过程中使用缓存的情况还是比较多的,记录一下Redis的参数说明以备以后查看: #Redis Config daemonize yes pidfile /var/run/redis.pid port ...
- Laravel / Lumen 框架修改 创建时间 和 更新时间 对应字段
为避免浪费时间--先上解决方案 在Model中重写 CREATED_AT 和 UPDATED_AT 两个类常量就可以了,这两个常量分别是创建时间和更新时间的字段名. ================= ...
- Android基础工具函数代码集
整理在学习研究Android开发,编写了一些基本用到的工具集,现在整理分享(后续会持续更新,有问题还请指出). 1.HttpClient工具,使用Apache的HttpClient类实现get和pos ...
- java实现多叉树查找
package tree; import java.util.List; import java.util.ArrayList; import java.io.Serializable; public ...