C++ 类、对象、class
一、对象初始化
1.不能在类声明中对数据成员初始化,因为类只是一个抽象类型,不占存储空间,无处容纳数据。
2.若某类的数据成员都是public,则可以像结构体一样初始化,如
Time t={12,21,04};
若数据成员有private或protected则不能这样初始化。
3.构造函数没有返回值,不需要用户调用,也无法被用户调用。
4.带参数的构造函数初始化格式:类名 对象名(实参1,实参2...)
5.构造函数的参数初始化列表格式:
类名::构造函数名(若干参数):初始化表{}
Student ::stu(x,y):stuNum(x),name(y){}
6.在类内声明构造函数时就可以指定默认参数,如
Box(int h=10,int w=10,int l=10)或Box()
默认构造函数要么无参,要么指定全部参数,一个类只能有一个默认构造函数,若定义了全参默认构造函数,则不能再重载构造函数,应该在声明构造函数时指定默认值,不能在定义时指定,若构造函数的全部参数都指定了默认值,则创建对象是可以给出任意个实参,也可以不给。
7.this指针指向对象,它的值是当前被调用的成员函数所在的对象的起始地址。
二、析构函数
1.用new动态创建对象,delete时会调用析构函数。析构函数只能有一个,用来执行“用户希望在最后一次使用对象之后所执行的任何操作”。
2.先构造的对象后析构,相当于栈。
三、对象数组
1.若构造函数只有一个参数,则可进行如下定义:Student stu[3]={5,8,12},三个参数分别给三个构造函数;
2.若构造函数不止一个参数,则亦可用上述方式定义,其中三个参数分别称为三个构造函数的第一个参数,但最好不要用上述方式来定义,因为会歧义(在vs2015中直接连编译都没通过)。应该用如下方式来定义:
Student stu[3]={Student(1,2,3),Student(11,12,13),Student(21,22,23)};
四、对象指针
1.指向普通函数的指针:
假设现有一函数
int haha(int i,char c)
{
//xxxxxxx
}
要通过指针来调用该函数,则先声明指针:
int (*p)(int i, char c);
再让指针指向函数:
p = haha或者p = &haha也行;
即可通过指针调用函数了,如:
(*p)(1, 'w');
2.指向成员函数的指针:
与普通指针函数相比,声明指针要加上类限制:int(Student::*p)(int i, char c);
定义指针也得加上类限制:p = &Student::haha,而且&不可省略。
用指针调用函数时必须通过对象:(stu.*p)(1, 'w');
五、共用数据保护
1.常对象:Time const t(1,2,3);或const Time t(1,2,3);定义时必须初始化,然后数据成员无法被修改。常对象只能调用常成员函数。
2.常成员函数:函数声明时最后要加上const,如:void haha()const;
常成员函数可以访问对象中数据成员,但不能修改。
3.若一定要修改常对象的某个数据成员,应该用关键字mutable,如:mutable int count;也只能通过常成员函数来修改。
4.常数据成员:只能通过构造函数的参数初始化表来初始化,并不能被更改。
六、对象动态建立、释放
1.一般的对象空间都不能随时释放,比如Student stu这样的,只能是在函数调用结束之类的时候被动释放。
2.new、delete就可以随时开辟、撤销空间,所以称为动态的。
七、静态成员
1.静态数据成员:是一个类的成员而不是某个对象的成员,一个类的所有对象都可以引用这个成员,是共用的,值都是一样的,如果改变值,则对所有对象来说这个值都会变,这样比较节省空间。即使不定义对象,也可以引用类的静态数据成员(用类名),也可以通过对象引用。不能用构造函数来初始化,只能在类外初始化。
如,static int a;
2.静态成员函数:性质和静态数据成员一样。调用一个对象的普通成员函数后,会将该对象的首地址赋给this指针,但静态成员函数没有this指针,不能访问非静态数据成员,只能访问静态数据成员。如果指定了对象,其实也是可以访问非静态数据成员的,但是一般不建议这么用。
如static int add();
八、类模板
1.有时多个类的功能相同,仅仅是数据类型不同,为了省去重复工作的麻烦,就可以用模板类。类模板是类的抽象,类是类模板的实例。
2.成员函数定义在类定义内:
template <class haha>//haha为数据类型
class hehe//hehe不是类名,是类模板名
{
private:
haha x;
haha y;
public:
hehe(haha a,haha b)
{
x=a;
y=b;
}
haha max()
{
return (x>y)?x:y;
}
}
使用时:hehe <int> hh(4,5);//此处int代替了上面的haha
3.成员函数定义在类定义外:则应该
template <class haha>//haha为数据类型
haha hehe<haha>:: max()
{
return (x>y)?x:y;
}
九、其他特性
1.c++是基于过程和面向对象的混合型语言。基于过程的程序主要是面对函数,只要设计一个个函数就行了。面向对象的程序主要是类,函数基本都在类内,所以主要是设计类。
2.基于过程的程序=算法+数据结构;
面向对象的程序=对象+消息=算法+数据结构+消息
3.定义类时一般先public后private。
4.c++也可以用struct关键字来定义类,与class唯一的区别就是struct默认为private。不推荐用struct。
5.在类定义内定义的成员函数,若不包括循环等结构,c++系统会自动将其作为inline函数。类外定义的成员函数就没有这个待遇了,必须要写上inline关键字才能成为内联函数。
6.函数的声明和定义只要有一个inline关键字就够了。
7.sizeof一个类时,返回值是这个类中数据成员的大小,跟成员函数无关,若没有数据成员则返回1。
8.一个类至少有一个public成员函数,负责就没有对外的接口,无法对对象进行操作。
C++ 类、对象、class的更多相关文章
- C++ 类对象和 指针的区别
C++ 类对象和 指针的区别 C++ 类对象和 指针的区别 转自:http://blog.csdn.net/ym19860303/article/details/8557746 指针的情况 class ...
- Android 通过 Intent 传递类对象或list对象
(转:http://www.cnblogs.com/shaocm/archive/2013/01/08/2851248.html) Android中Intent传递类对象提供了两种方式一种是 通过实现 ...
- NSLog(@"%@",类对象); 默认输出类名
NSLog()函数输出Objective-c对象时,输出的是该对象的description方法的返回值.也就是说,以下两行代码作用完全一样(假设p是指向任何对象的指针变量). NSLog(@" ...
- WPF整理-XAML构建后台类对象
1.XAML 接触WPF的第一眼就是XAML---XAML是用来描绘界面的.其实不然! "Actually, XAML has nothing to do with UI. It's mer ...
- class中new与未new的区别 类对象占用空间--转载
转载自http://blog.sina.com.cn/shuiwuhendeboke 颗颗的博客 (1)作用域不同 不用new:作用域限制在定义类对象的方法中,当方法结束时,类对象也被系统释放了 ...
- 规则引擎集成接口(九)Java类对象
Java类对象 右键点击“对象库” —“添加java类对象”,如下图: 弹出窗体,在文本框中输入类的全名“com.flagleader.test.Test”,选择该类型后确定,如下: 显示如下,勾选上 ...
- 1,SFDC 开发篇 - 类对象和SOQL查询
1,类对象 & 接口 & 属性 2, Object & SOQL
- 福利->KVC+Runtime获取类/对象的属性/成员变量/方法/协议并实现字典转模型
我们知道,KVC+Runtime可以做非常多的事情.有了这个,我们可以实现很多的效果. 这里来个福利,利用KVC+Runtime获取类/对象的所有成员变量.属性.方法及协议: 并利用它来实现字典转模型 ...
- Python的高级特性8:你真的了解类,对象,实例,方法吗
Python的高级特性1-7系列是本人从Python2过渡3时写下的一些个人见解(不敢说一定对),接下来的系列主要会以类级为主. 类,对象,实例,方法是几个面向对象的几个基本概念,其实我觉得很多人并不 ...
- Effective Objective-C 2.0 — 第14条:理解“类对象“的用意
每个实例都有一个指向Class 对象的指针,用以表明其类型,而这些 Class 对象则构成了类的继承体系. 如果对象类型无法在编译期确定,那么就应该使用类型信息查询方法来探知. 尽量使用类型信息查询方 ...
随机推荐
- Java 解析excel2003和2007区别和兼容性问题(POI操作)
最近在使用POI对excel操作中发现一些问题,2003和2007的区别还是蛮大的: 2007相关的包: poi-3.9.jar poi-examples-3.8.jar poi-excelant-3 ...
- Latex 1: 解决latex中遇到一个常见错误:"Improper alphabetic constant."
1.问题: 本人是在WIN7下用texlive 2016,编辑器用的是WinEdt 10.1 ,运行如下代码: \documentclass{ctexbook} \begin{document} \t ...
- 注册中心Eureka页面添加用户认证
我们需要登录即可访问到Eureka服务,这样其实是不安全的 为Eureka添加用户认证. 第一步,为itcast-microservice-eureka添加安全认证依赖: 第二步,增加applicat ...
- c# 字节高低位
byte n = br.ReadByte(); ; // 高位 var l = n & 0x0f; // 低位
- bzoj 1941 Hide and Seek
题目大意: n个点,求每个点到其最远点距离-到其最近点距离(除自己之外)的最小值 思路: 对于估计函数的理解还不够深刻 #include<iostream> #include<cst ...
- ML.NET
ML.NET http://www.cnblogs.com/BeanHsiang/category/1218714.html 随笔分类 - 使用ML.NET实现NBA得分预测 摘要: 本文将介绍一种特 ...
- [Usaco2018 Feb] New Barns
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=5192 [算法] 维护树的直径,在树上离一个点最远的点一定是一条直径的端点. ...
- 细数vue爬坑之路<坑路大集合>
坑爹集锦一: npm出现Newline required at end of file but not found错误 原因:eslint语法错误(vue为后缀名的组件结尾没有换行) 解决办法:在结尾 ...
- 如何管理第三方接口token过期时间
背景: 随着微服务的盛行,做开发时不可避免的要涉及第三方接口,安全起见,这些接口都会需要一个token参数.而token一般都会有一个过期时间,比如2小时或者30分钟.那么如何在自己的应用中存储并管理 ...
- Luogu P2920 时间管理【二分答案】
二分答案水题. (像我这么蒻的人都能十几分钟A掉) https://www.luogu.org/problemnew/show/P2920 开始时间一定在从0到min(t[i]-s[i])的一段区间上 ...