C++_基础_类和对象2
内容:
(1)构造函数
(2)初始化列表及其必要性
(3)支持自定义类型转换的构造函数
(4)this指针
(5)const对象和成员函数
(6)析构函数
1.构造函数
1.1 格式:
class 类名
{
类名(形参表)
{
构造函数体;
}
};
练习:
自定义Student类,属性有:姓名和年龄,提供一个show函数即可
注意:
(1)创建对象时会自动调用构造函数进行初始化,初始化成员变量
(2)如果一个类中没有自定义构造函数,那么系统会自动提供一个无参的构造函数(缺省构造函数,默认构造函数);一旦出现任何形式的自定义构造函数,那么系统就不再提供无参构造函数
扩展:
无参构造函数未必真的没有参数,而是可以用无参的形式去调用
2.初始化列表及其必要性
2.1 初始化列表
格式:
class 类名
{
类名(形参表):成员变量名(形参名),...
{
构造函数体;
}
};
注意:
成员变量的初始化顺序和初始化列表中的先后顺序无关,而是取决于成员变量的定义顺序
笔试题:
class Dumy
{
private:
int m_len;
string m_str;
public:
Dumy(const string& str):m_str(str),m_len(m_str.length());
};
问题:
请问上面的代码有没有问题?如果有问题如何解决?
解析:
有问题,先给m_len赋值,而此时m_str还没有初始化,结果不正确
解决方案:(所以定义成员变量时需要小心?)
(1)交换成员变量的顺序
(2)m_len(str.length())
2.2 定义、声明、初始化的不同(不考虑static变量)
int num = 10;
(1)声明
类定义中的成员变量写法 叫做声明
(2)定义
当使用类类型创建对象时,对象中的成员变量才会被定义,也就是分配内存
(3)初始化
当对象被创建时,自动调用构造函数进行初始化,如果有初始化列表则按照初始化列表的方式进行初始化;如果没有则采用默认初始化方式,对于类类型的成员变量则调用默认构造函数初始化
执行流程:
创建对象 -> 分配对象中成员变量的内存 -> 自动调用构造函数进行初始化
-> 执行构造函数体;
2.3 初始化列表的必要性
(1)类中包含常量和引用型的成员变量,那么必须通过构造函数和初始化列表的形式进行初始化
(2)在子类中显式地构造其基类部分(以后讲到)
3.支持自定义类型转换的构造函数 ??
在目标类型中自定义如下形式的构造函数:
目标类::目标类(const 源类& 源类对象){ ...}
功能:
实现从源类型到目标类型的隐式转换
注意:
通过使用explicit关键字可以指示该构造函数只能用于显式类型转换,以防止潜在的错误
4.this指针
概念:
class B{};
class A
{
public:
void show(B b){...}
};
int main(void)
{
B b;
A a;
a.show(b);
}
其中a叫做调用对象,b叫做参数对象
4.1 this指针的概念
一般而言,关键字this就是一个指针,对于一般成员函数来说,该指针指向调用对象;对于构造函数来说,该指针指向这个正在构造的对象
注意:
构造函数和普通成员函数内部都隐含一个this指针,用于保存调用对象/正在构造对象的 地址(内部那边?参数?)
4.2 this指针的用途
(1)this指针可以用于在构造函数中区分与构造参数名相同的成员变量,初始化列表中不存在此问题
(2)this指针可以用于返回自引用的场合
(3)this指针可以作为函数的参数实现对象间的交互
5.const对象和const成员函数
(1)const修饰的函数叫做常量型函数,该函数中的this指针为常量型,以此防止对成员变量的意外修改
(2)通过常量类型的 指针/引用 只能访问其常量型的成员函数,否则引发编译错误
(3)常量型成员函数和非常量型成员函数之间构成重载,通过常量型对象、引用以及指针只能调用常量型的成员函数,而对于非常量型的对象、引用以及指针则优先调用非常量型成员函数
(4)使用mutable关键字修饰成员变量,表示该成员变量可以在常量型成员函数中被修改
复习:
const int* pi = &i;// *pi不可变
int const *pi = &i;// *pi不可变
int* const pi = &i;// pi不可变
const int* const pi;
// pi 和 *pi 都不可改变
练习:
自定义一个Clock类,
属性:时、分、秒,
行为:
提供一个无参的构造函数实现用当 前系统的时间初始化成员变量时分秒
提供一个run函数,每隔一秒打印 一次时间
提示:
time(0) 获取系统时间
localtime 拆出时分秒
/////////////////////////////////////////////////////////////////////////
1.初始化列表
-初始化列表的注意点
-初始化列表用法,多写几个例子熟悉用法即可
2.构造函数
-构造函数的注意点
-怎样规范的去写构造函数?
3.this指针
-为什么要有this指针?
-this指针是怎么实现?
-this指针有什么用?怎么用?
4.const
-const 对象
-const 函数
-const 返回值
-const 参数
-const 变量
-const 注意点
-const 的编译实现
C++_基础_类和对象2的更多相关文章
- 086 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 03 面向对象基础总结 01 面向对象基础(类和对象)总结
086 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 03 面向对象基础总结 01 面向对象基础(类和对象)总结 本文知识点:面向对象基础(类和对象)总结 说明 ...
- C++_基础_类和对象
内容: (1)引用 (2)类型转换 (3)C++社区给C程序员的建议 (4)面向对象编程的概念 (5)类和对象 (6)构造函数 (7)初始化列表及其必要性 1.引用1.1 指针和引用的使用说明(1)指 ...
- java基础知识—类和对象
1.对象的特征---类的属性 每个对象的每个属性都有特定的值 对象的操作---类的方法 2.封装 对象同时具有属性和方法两项属性. 对象的属性和方法同时被封装在一起,共同体现事物的特性,二者相辅相成, ...
- ObjectiveC1基础代码——类和对象
// // main.m // ObjectiveC1 // // Created by scjy on 15/10/30. // Copyright © 2015年 lizhipeng. A ...
- C++_基础_继承、多态
内容: (1)子类中的拷贝构造和拷贝赋值 (2)多继承和虚继承 (3)多态的初识 (4)虚析构的特性和使用 (5)多态的底层实现 (6)纯虚函数.抽象类的概念 1.子类中的拷贝构造和拷贝赋值 子类中的 ...
- J2SE基础:1.类和对象基础
什么是对象 在Java语言,全部的人,事物或者模块都是一个对象. 同样的对象具有一些同样的特性. 狗,猫,蛇3个对象(动物的对象) 苹果,梨,桔子3个对象(水果的对象) 什么是类 能够将现实生活中的对 ...
- Java基础-3类和对象声明与创建
一).在1和2中有粗略介绍过类和对象的概念,在这里简单回顾一下: 对象与类:一个实际或者虚拟的物体,这个物体既是我们的对象,这个物体呢又是属于一个分类,如动物类,人类 二).创建对象: 在创建对象的时 ...
- php之基础深入---类与对象篇
1.类的自动加载: spl_autoload_register()函数可以注册任意数量的自动加载器,当使用尚未被定义的类(class)和接口(interface)时自动去加载,这样可以避免includ ...
- Java基础教程——类和对象
视屏讲解:https://www.bilibili.com/video/av48272174 面向过程 VS 面向对象 面向过程:强调步骤. 面向对象:强调对象. 面向对象的特点就是:隐藏具体实现的细 ...
- C++_基础_类和对象3
内容: (1)析构函数 (2)拷贝构造和拷贝赋值 (3)静态成员 (4)成员指针 (5)输入输出运算符重载 1.析构函数 当一个对象被创建时,自动调用构造函数进行初始化 当一个对象被销毁时,自动调用析 ...
随机推荐
- Body joints angle using Kinect
http://stackoverflow.com/questions/12608734/body-joints-angle-using-kinect-checking-time-interval?rq ...
- DOM 样式操作
通过js动态的修改样式 更新样式的方法:一.使用.style方法修改样式,缺点是使样式混杂在js中,再次修改不易.二.更新class属性,更改样式.三.一次性更改很多元素样式(如换肤操作),更改样式表 ...
- FAQ:win7和win8 64位注册ocx控件方法
win7/win8 问题所在: 64位的系统一般都是可以安装32位程序的, 执行 C:\Windows\SysWOW64\regsvr32.exe 而不是 C:\Windows\Sys ...
- css 中的若干心得
css布局中定位机制主要是普通的流,也就是说按照HTML文本的顺序在窗口上从上到下.从左到右去显示,遇见块级元素就换行显示.为了更进一步的控制,我可以使用相对定位.绝对定位.固定定位以及浮动. 相对定 ...
- ORA-04031: 无法分配 共享内存
今天现场项目oracle系统定时器插入数据报错: --ORA-04031: 无法分配 3936 字节的共享内存 ("shared pool","truncate tabl ...
- hdu3516
题目大意:这个....翻译起来还真是不好说,各位四六没过的ACMer正好去原网页看看题意,过了的好孩子还是去看看原网页看看锻炼一下吧.(当然我做这道题目的时候,教练已经摆明说要用四边形不等式,所以还是 ...
- Description:一根高筋拉面,中间切一刀,可以得到2根面条。如果先对折1次,中间切一刀,可以得到3根面条。如果连续对折2次,中间切一刀,可以得到5根面条。Input:你的程序需要解决的问题是,输入连续对折的次数。NOutput输出中间切一刀,可以得到多少根面条。
#include<iostream> using namespace std ; int main() { int n ; while(cin >> n) { << ...
- Linux学习之nl命令
nl命令在linux系统中用来计算文件中行号.nl 可以将输出的文件内容自动的加上行号!其默认的结果与 cat -n 有点不太一样, nl 可以将行号做比较多的显示设计,包括位数与是否自动补齐 0 等 ...
- mysql触发器使用注意
1.在创建触发器的时候,语句中避免在一个select语句查询多个列,例如使用select a,b from table,应该分开使用select语句, 例如select a from table s ...
- EBS OAF中如何在多行表中实现附件功能
EBS OAF中如何在多行表中实现附件功能 (版权声明,本人原创或者翻译的文章如需转载,如转载用于个人学习,请注明出处:否则请与本人联系,违者必究) 在OAF中使用附件功能之前,要先明白Entity( ...