C++_基础_类和对象
内容:
(1)引用
(2)类型转换
(3)C++社区给C程序员的建议
(4)面向对象编程的概念
(5)类和对象
(6)构造函数
(7)初始化列表及其必要性
1.引用
1.1 指针和引用的使用说明
(1)指针中*的停靠问题
int* pi;
int * pi;
int *pi;// 效果都是一样的
不成文的规则:
如果定义一个指针变量时,习惯上让*停靠在数据类型的那边;如果定义多个指针变量时,习惯上让*停靠在变量名的那边
如:
int* pi;
int *pi,*pj;
(2)引用中&的停靠问题
int& b = a;
int & b = a;
int &b = a;//效果一样
int& b = a;
int &m = a,&n = b;//同上
(3)起别名的方式去使用
typedef int* PINT;
typedef int& RINT;
PINT i,j; //两个指针 (避免了Int *p,q,定义一个指针一个整型的情况)
RINT m = a,n = b; //两个引用
1.2 扩展(指针和引用的区别)
(1)可以定义指向指针的指针,但是不可以定义指向引用的指针
如:
int a = 10;
int* pa = &a;//一级指针
int** ppa = &pa;//二级指针
int& b = a;//a起别名为b
int& *pb = &b; //error
(2)可以定义引用指针的引用,不可以定义引用 引用的引用
如:
int a = 10;
int* pa = &a;
int* &ra = pa; //ok
int& b = a;
int&& rb = b; // error
(3)可以声明指针数组,不可以声明引用型数组,但是可以声明数组的引用
如:
int* pa[5]; //指针数组
int& pa[5];// error
int (*pa)[5];//数组指针
int (&pa)[5];//数组引用
1.3 引用作为函数的参数(使用引用的好处)
(1)使用引用型参数可以在函数中对实参变量的值进行修改
(2)使用引用型参数可以避免参数在传递过程中发生数据内容的拷贝
(3)通过将参数定义为常引用,防止在函数体内对实参的意外修改,同时还可以接受常量型实参
(4)引用作为函数的形参实际上就是址传递
建议:
对于函数的参数来说,尽量加&,尽量加const,一般用于自定义数据类型
练习:
分别使用int类型变量、指针以及引用作为函数的参数,来交换两个实参变量的值
1.4 引用作为函数的返回值
永远不要返回对局部变量(包括函数的形参)的引用,可以返回 静态局部变量/全局变量/动态内存/实参的引用/成员变量 的引用,这些返回值都是安全的
2.类型转换
隐式类型转换: 一般从小 -> 大
显式类型转换(强制类型转换): 一般从大到小的转换
如:
char c ;
int i = (int)c; //C语言风格
int i = int(c); //C++风格
(1)静态类型转换
目标类型 变量名 =
static_cast<目标类型>(源类型变量);
功能:
如果在目标类型和源类型之间只要有一个方向上可以做隐式类型转换,那么在两个方向上都可以做静态类型转换;反之,如果在两个方向上都不能做隐式类型转换,那么在两个方向上都不能做静态类型转换
(2)常量类型转换
目标类型 变量名 =
const_cast<目标类型>(源类型变量);
功能:
主要用于去除指针/引用上的常属性
注意:
试图通过const_cast去修改一个常量的值,那么后果是不确定的
(3)重解释类型转换
目标类型 变量名 =
reinterpret_cast<目标类型>(源类型变量名);
功能:
主要用于任意两种指针类型之间的转换,以及指针和整型之间的转换
(4)动态类型转换
目标类型 变量名 =
dynamic_cast<目标类型>(源类型变量名);
功能:
主要用于具有多态特性的父子类 指针/引用 之间的转换(以后讲到)
3.C++社区对C程序员的建议
(1)尽量少使用宏,而代之以 const 和 enum 以及 inline替代之
如:
#define PI 3.14
const double pi = 3.14;
#define MAX(x,y) (x)>(y)?(x):(y)
inline int max(int x,int y)
{
return x>y?x:y;
}
(2)变量随使用随声明
(3)不用malloc/free 而用new/delete
(4)避免使用void*、指针算数、联合以及强制类型转换
(5)尽量少使用C风格字符串,代之以string对象
strcpy/strcmp/strcat/...
(6)理解面向对象的编程思想
4.面向对象编程的初识
4.1 什么是对象?
万物皆对象,无论是任何对象,都可以去分析它的属性以及行为
4.2 什么是面向对象?
以属性和行为的观点去分析现实世界的事物的方式 叫 面向对象
面向对象 -> 大处着眼
面向过程 -> 关注的整个过程的细节
4.3 什么是面向对象编程?
先采用面向对象的思想去分析,然后采用面向对象的编程语言把分析出来的方法表达出来
4.4 为什么需要面向对象编程?
软件产业化发展的需求
5.类和对象
把对象的共性提取出来就组成类
如:
学生类:
属性:姓名 年龄 性别 学号
行为:吃饭 学习 娱乐
教师类:
属性:姓名 年龄 性别 职称
行为:吃饭 授课 娱乐
采用C++语法形式将上述过程描述出来就叫面向对象编程
5.1 类的定义
格式:
class 类名{};
如:
class Student{};
5.2 成员变量(属性)
格式:
class 类名
{
数据类型 成员变量名;
...
};
如:
class Student
{
string m_name;//姓名
int m_age; //年龄
};
5.3 成员函数(行为)
格式:
class 类名
{
返回值类型 函数名(形参表)
{
成员函数体;
}
};
如:
class Student
{
string m_name;
int m_age;
void learn(const string& lesson){ ... }
};
5.4 访控属性
(1)public 公有的
(2)protected 保护的
(3)private 私有的
访问限定符 访控属性 本类 子类 类外
---------------------------------
public 公有的 ok ok ok
protected 保护的 ok ok no
private 私有的 ok no no
结构体和类的区别:
(1)关键字不同
(2)类中默认访控属性是私有的,而结 构体中默认访控属性是公有的
6.构造函数
函数名与类名相同,函数没有返回值类型(连void都没有)的函数叫构造函数
格式:
class 类名
{
类名(形参表)
{
构造函数体;
}
};
注意:
当对象被创建时构造函数会被自动调用,一般用于对对象进行初始化,也就是给对象的成员变量进行初始化
/////////////////////////////////////////////////////////////////////
1.引用
-为什么要有引用?
-引用的底层实现是什么?
-引用的使用场景?
-引用和指针的区别?(从本质上相区别)
-使用引用的注意点?
2.类型转换
-用的比较少,举几个例子知道作用就ok了
3.面向对象
-为什么要有面向对象?
-面向对象和面向过程有什么区别?
-解决问题的思路和方法不一样
-构造函数
-对象的初始化为什么要采用构造函数?
-类这个类型,在底层是怎么样实现的?
-类的内存是怎样分配的?
-类的访问控制属性为什么要存在?
C++_基础_类和对象的更多相关文章
- 086 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 03 面向对象基础总结 01 面向对象基础(类和对象)总结
086 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 03 面向对象基础总结 01 面向对象基础(类和对象)总结 本文知识点:面向对象基础(类和对象)总结 说明 ...
- 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.析构函数 当一个对象被创建时,自动调用构造函数进行初始化 当一个对象被销毁时,自动调用析 ...
随机推荐
- 重写系统中的UINavigationController返回按钮的事件
1.扩展UIviewController UIViewController+BackButtonHandler.h #import <UIKit/UIKit.h> @protocol Ba ...
- swift 用协议实现代理传值功能
1.功能简介 RootViewController中用个lable和一个按钮,点击按钮跳转到模态窗口.在模态窗口中有个TextField和一个按钮,输入文字点击关闭模态按钮后跳转到RootViewCo ...
- zepto打造一款移动端划屏插件
效果图 样式1 样式2 调用 正常情况下应该是后台生成的html代码,但还是写了一套操作tab页的方法 调用简便如下: <link rel="stylesheet" href ...
- C#小性能知识
字符串比较 string s = ""; 1) if(s == ""){} 2) if(s == string.Empty){} 3) if (string.I ...
- JS onkeydown控制HTML Input 只录入浮点数值
// -1) return false; return index == 0 } keychar = String.fromCharCode(keynum) var newVal = oriVal.s ...
- sql 去除结尾的回车或者换行
CREATE FUNCTION REMOVE_ENTER (@DESC VARCHAR(8000))RETURNS VARCHAR(8000)ASBEGIN DECLARE @STR VARCHAR( ...
- OC中的一个特性:延展
OC中的一个特性:延展其实说白了,延展就是弥补C语言中的前向申明,我们知道,在C语言中,如果你想调用一个函数的话,那么在此之前必须要声明一个这个函数,就是有前置性.OC中为了弥补C语言中的这个问题,就 ...
- 接收Dialog的值
System.Windows.Forms.DialogResult result = MessageBoxEx.Show("保存成功", Language.String.Hint, ...
- ORA-600[kcratr_scan_lastbwr]逻辑坏块解决
数据库版本: 11.2.0.3 问题现象: 今天在启动一台测试数据库的时候,发现db不能open,报错如下: ERROR at line 1: ORA-00600: internal error co ...
- poj2891--扩展欧几里德算法
/* 该题使用的是扩展欧几里德算法,求模线性同余方程: 分析题目:以题目输出结果为例 ,要求得到一个整数X可以满足 X % a = r,a,r,为数组名: 设数组元素为两个时, 列出方程:X % a1 ...