类的定义与实例化、构造函数和初始化表(day04)
十三 类的定义与实例化
类的一般形式
class/struct 类名:继承表{
访问控制限定符:
类名(形参表):初始化表{}//构造函数
~类名(void){}//析构函数
返回类型 函数名(形参表){}//成员函数
数据类型 变量名;//成员变量
};
访问控制限定符
)public
公有成员,类内部和外部都可以访问的成员
)private
私有成员,只能在类的内部访问的成员
)protected
保护成员(后面讲)
注:class定义类,默认访问控制属性是private,而struct定义的类默认的访问控制属性是public。
eg:
class/struct A{
public:
member1;//公有成员
private:
member2;//私有成员
public:
member3;//公有成员
void func(){
member1 = ;//ok
member2 = ;//ok,类内部可以访问私有成员
}
};
int main(){
A a;
a.member1 //ok,类的外部可以访问公有成员
a.member2 //error,类的外部不能访问私有成员
} 构造函数(Constructor)
class 类名{
类名(构造形参表){
//构造函数体
}
};
)函数名与类名相同,并且没有返回类型
)构造函数在创建对象时自动被调用,不能像普通的成员函数一样直接去调用。
)构造函数主要负责初始化对象,即初始化成员变量。 对象的创建和销毁
)在栈区创建单个对象//重点掌握
类名 对象名(构造实参表);
类名 对象名 = 类名(构造实参表);
注:两种写法完全等价
)在栈区创建多个对象(对象数组)//了解
类名 对象数组[元素个数] =
{类名(构造实参表),类名(构造实参表)..} )在堆区创建/销毁单个对象//重点掌握
创建:类名* 对象指针 = new 类名(构造实参表);
销毁:delete 对象指针; )在堆区创建/销毁多个对象//了解
创建:
类名* 对象指针 =
new 类名[元素个数]{类名(构造实参表),...};
销毁:
delete[] 对象指针;
===============================
练习:实现电子时钟类,让其构造接收当前系统时间,以秒为单位运行。
class Clock{
public:
Clock(time_t t){
tm* local = localtime(&t);
m_hour = local->tm_hour;
m_min = local->tm_min;
m_sec = lcoal->tm_sec;
}
void run(void){
while(){
计时:+1秒
打印当前时间;
sleep();
}
}
private:
int m_hour;//小时
int m_min;//分钟
int m_sec;//秒
};
int main(){
Clock c(time(NULL));
c.run();
return ;
}
=============
多文件编程
)类的声明部分放在xx.h头文件中
)类的实现部分放在xx.cpp源程序中
)类的使用代码一般会放在其它文件中 练习:使用多文件编程方法重构电子时钟类 =============
十四 构造函数和初始化表
构造函数可以重载、可以带有缺省参数,也可以定义哑元.
缺省构造函数(无参构造函数)
)如果类中没有定义任何构造函数,那么编译器会提供一个缺省(无参)构造函数。
--》对于基本类型的成员变量不做初始化
--》对类 类型的成员变量,会自动调用相应类型的无参构造函数来初始化
eg:
class B{
public:
B(void){
m_j = ;
}
int m_j;
};
class A{
public:
int m_i;//基本类型的成员变量
B m_b;//类 类型的成员变量(成员子对象)
};
int main(void){
A a;
cout << a.m_i << endl;//不确定
cout << a.m_b.m_j << endl;//
}
)如果类中定义了构造函数,无论是否有参数,那么编译都不会再提供无参构造函数 类型转换构造函数(单参构造函数)
class 目标类型{
public:
[explicit] 目标类型(源类型 src){...}
};
可以实现源类型到目标类型的隐式转换 注:使用explicit关键字,可以强制这种转换必须显式的完成。 拷贝(复制)构造函数
)用一个已定义的对象构造同类型的副本对象时,会调用该类的拷贝构造函数.
class 类名{
类名(const 类名& that){...}
};
eg:
class A{...};
A a1;
A a2(a1);//拷贝构造函数
A a2 = a1;//和上面完全等价 )如果一个类没有定义拷贝构造函数,那么编译器会为其提供一个缺省拷贝构造函数
--》对基本类型的成员变量,按字节复制
--》对类 类型成员变量,调用相应类拷贝构造函数 注:在大部分情况下,不需要自己定义拷贝构造函数,因为编译器所提供的缺省拷贝构造函数已经很好用了。 )拷贝构造函数的调用时机
--》用已定义的对象作为类型对象的构造函数
--》以对象形式向函数传递参数
--》从函数中返回对象(有可能会被编译器优化掉)
类的定义与实例化、构造函数和初始化表(day04)的更多相关文章
- php类的定义与实例化方法
php类的定义 类是对某个对象的定义.它包含有关对象动作方式的信息,包括它的名称.方法.属性和事件.实际上它本身并不是对象,因为它不存在于内存中.当引用类的代码运行时,类的一个新的实例,即对象,就在内 ...
- 构造函数和初始化表、this指针与常函数、析构函数、拷贝构造与拷贝赋值(day05)
十四 构造函数和初始化表 ... 初始化表 )语法形式 class 类名{ 类名(形参表):成员变量1(初值),...{} }; )必须要使用初始化表的场景 -->如果有类 类型的成员变量,而该 ...
- Java知多少(18)类的定义及其实例化
类必须先定义才能使用.类是创建对象的模板,创建对象也叫类的实例化. 下面通过一个简单的例子来理解Java中类的定义: public class Dog{ String name; int age; v ...
- Java类的定义及其实例化
如果你不了解类和对象的概念,请猛击这里:Java类和对象的概念 类必须先定义才能使用.类是创建对象的模板,创建对象也叫类的实例化. 下面通过一个简单的例子来理解Java中类的定义: public cl ...
- 《Java基础知识》Java类的定义及其实例化
类必须先定义才能使用.类是创建对象的模板,创建对象也叫类的实例化. 下面通过一个简单的例子来理解Java中类的定义: public class Dog { String name; int age; ...
- C++ template学习二 类模板定义及实例化
一个类模板(也称为类属类或类生成类)允许用户为类定义一种模式,使得类中的某些数据成员.默写成员函数的参数.某些成员函数的返回值,能够取任意类型(包括系统预定义的和用户自定义的). 如果一个类中数据成员 ...
- 一个简单的c++类的定义和实例化
#include "iostream" #include <string> using namespace std; class mycoach { private: ...
- C++(1)C++类四个默认函数---构造函数、析构函数、拷贝函数、赋值函数
C++构造函数和析构函数 默认构造函数指不带参数或者所有参数都有缺省值的构造函数!!! (1)构造函数.析构函数与赋值函数 构造函数.析构函数与赋值函数是每个类最基本的函数.它们太普通以致让人容易麻痹 ...
- 类的声明与实例化及构造方法析构方法(PHP学习)
<?php class human{ public static $leg=2; public $name = 'leo'; public $age = '25'; public functio ...
随机推荐
- HDU 4363
这题是记忆化搜索很容易想到,但状态却不好设 dp[i][j][u][d][l][r][k].对于矩形为i*j,它的四周的颜色分别为u,d,l,r,横竖切的状态为k的种数. 其中要注意一个问题是,停止不 ...
- 查询和删除数据表中反复数据的sql
1.查询表中反复数据. select * from people where peopleId in (select peopleId from people group by ...
- oracle capability i/o(压力測试数据库serveri/o性能)
今天是2014-04-21,今天简单仅仅说明一下怎么影响重做数据的一个因素,那就是i/o吞吐量,oracle的介质恢复依赖于i/o,假设i/o存在瓶颈,那么势必会影响备库的介质恢复. 那么i/o st ...
- android 用java代码设置布局、视图View的宽度/高度或自适应
在achat项目中,对话内容的长宽设置为自适应.可是假设文本内容太多,则宽度几乎相同布满,若自己说的和对方说的都非常多内容.则满屏都是文字.则不easy分辨出是来自别人说的还是自己说的.那么须要对本身 ...
- select readonly 不能看到其它选项解决方式
在html中是select readonly后.依旧能够下拉选择.不想做disabled添加隐藏域,以下提供两种解决方式 解决方式1: onfocus="this.defaultIndex= ...
- Mahout算法调用展示平台2.1
软件版本号: windows7: Tomcat7.JDK7.Spring4.0.2.Struts2.3.Hibernate4.3.myeclipse10.0.easyui:Linux(centos6. ...
- 运用smali自己主动注入技术分析android应用程序行为
如今android开发人员社区里,除了app开发外,还有非常多周边的工具类产品,比方安全.性能等,app产品 已经出现了巨无霸,可是工具类的产品.眼下还没有出现规模比較大的公司,大部分还处于创业阶段, ...
- extjs的formpanel横向滚动条的解决办法
关于formpanel设置autoscroll:true同时出现横向和纵向滚动条的解决办法: 不要设置autoscroll属性,或者autoscroll:false,然后设置bodyStyle : ' ...
- jQery总结01
1 jQuery 的基本语法结构是什么? 2 $(document).ready() 与 window.onload 有什么区别? 3 如何实现 DOM 对象和 jQuery对象间的转化?
- luogu1631 序列合并
题目大意 有两个序列A,B,在A和B中各取一个数相加能得到$n^2$个和.求出这些和前n小的数字. 题解 首先这道题不可以用自己想的什么A序列B序列各两个指针的自己发明的模拟算法,用这样的算法只能是绝 ...