类与模板注意事项

C++是面向对象的,对象由类生成那么生成的对象应该注意些什么呢?类是怎么去生成对象的呢?类既然是个自定义的类型,那么类的内存是怎么样的呢?关于类去生成对象的各种需要去了解的点在下面都将会被提到;

类的实例化:开辟内存并初始化

封装

public

protected

private

把类的属性和函数实现封装起来;
对象是怎么去访问其成员的呢?就和结构体去访问其成员一样,需要靠对象(变量)去访问其成员;

this指针  student *const this;(this是对象内存空间的地址,依赖对象);

_this_call调用约定;
1.构造函数:student(){};

初始化内存空间(可以重载)不依赖对象调用,不能手动调用;

2.析构函数:~student(){}

释放资源,释放内存(不可以重载)依赖对象调用,可以手动调用但系统还会调用析构函数(退化为普通函数的调用)你不可以决定自己的出生,但你可以决定自己的死亡

3.拷贝构造函数:student(const & stu){}

用一个已存在的对象去生成一个新的同类型的对象,实参付给形参是初始化的过程,所以参数类型要用引用,防止递归调用生成形参对象,最终造成栈溢出;

深拷贝:申请新资源,赋值

4.赋值运算符的重载函数:student & operator=(const & stu){}

用一个存在的对象给一个已存在的对象赋值;需要进行自赋值的判断  
(&可以去掉,为了调高函数的运行效率)
深拷贝:自赋值的判断,释放旧资源,开辟新资源,赋值
实现安全的深拷贝:临时对象来保存旧的对象

写实拷贝的实现:

其他两个默认函数:
取地址操作符的重载函数:
const修饰的取地址操作符的重载函数:
对象的生存周期:
临时量
1.内置类型:常量
2.自定义类型:变量
优化:如果生成临时对象的目的是为了生成一个新的对象,那么会以生成临时对象的方式生成新对象。(隐式生成临时对象)
隐式生成的临时对象是常量
逗号表达式     0v0
引用提升了临时对象的生存周期;
不建议用指针指向临时对象;临时对象在表达式结束销毁
const int &a=10;//true

static修饰成员变量不属于对象,属于类作用域;一定要在类外初始化;
static修饰的成员方法:cd_call调用约定,无this指针,不依赖对象调用;不可以访问成员变量,和成员方法,
只能访问静态成员变量和静态成员方法;

模板 c++泛型
1.函数模板template<T T>
函数模板(定义点)
模板的实例化(调用点:用具体的类型来替换虚假的类型)
模板函数(最后形成的调用函数)
模板的编译:
定义点:模板的头部;判断是否是模板函数
调用点:模板函数,编译模板函数内容(若没有传入模板参数的类型,模板的实例化系统会自行推演)
1.有实参系统才会推演 2.实参与形参不能产生二异性
模板类型参数列表
1.类型参数, typename | class
2.非类型参数, int SIZE; 当做常量处理(float类型不能做非类型参数)
模板的特例化:如:compare(char* a,char *b){return a>b;}
==>compare(char* a,char* b){strcmp(a,b);}
调用的优先级: 特例化版本 > 模板版本
模板需要精确匹配;
类模板:
函数的选择性实例化:不调用只会编译头部
typename:告诉编译器后面跟的是一个类型;声明一个类型; 在模板参数列表中与class一样 template<typename T>==template<class T>
auto:接受不明确类型;(模板中使用)
运算符重载:为了满足自定义类型和内置函数一样的逻辑关系;
void operator+(){}
不能改变运算符的优先级;
满足和系统提供的相同逻辑;
不能创造新的运算符;例如:operator +-(){}
内存池:
new;delete;
状态的切换;频繁的new和delete效率差;容易产生内存碎片(外碎片);(内碎片:结构体对齐);
实现了内存的自我分配和释放;资源可以循环利用;
内存池的实现:静态链表;函数重载(operator new,delete);内存池;单例模式;

下一章有C++的写实拷贝和内存池的简单实现代码;

原文地址:https://www.cnblogs.com/xcb-1024day/p/11283014.html

时间: 2024-11-08 15:52:26

类与模板注意事项的相关文章

函数模板注意事项

一.模板重载 ①和常规重载一样,被重载的模板的函数特征标必须不同. ②并非所有的模板参数都必须是模板参数类型.例如: template<class T> void swap(T& a,T& b); template<class T> void swap(T* a,T* b,int n);//第三个参数类型为具体类型int,而不是通用类型 二.显示具体化 对于某些类型的参数,我们的算法可能略有不同,比如:对于一个结构体,虽然将一个结构体赋给另一个结构体是允许的,但是,

模板类继承模板类

今天写的代码提交到OJ上就出现这样的错误,但是vs并不会出错. '_elem' was not declared in this scope 原因在于模板类继承模板类,子类看不见父类的成员. 但是VC++做了一些小拓展,可以不适用this->就调用父类成员. gcc在扫描到模板类时就要求确定每一个成员在哪里声明的,VC++在类实例化之后再检测,就不会有这个问题. 可以使用以下方式解决: 方法1: 使用this template<typename T> class A { protecte

【转载】C++ 与“类”有关的注意事项总结(十二):按成员初始化 与 按成员赋值

原文:C++ 与"类"有关的注意事项总结(十二):按成员初始化 与 按成员赋值 一.按成员初始化(与构造函数和拷贝构造函数有关) 用一个类对象初始化另一个类对象,比如: Account oldAcct( "Anna Livia Plurabelle" ); Account newAcct( oldAcct ); 被称为缺省的按成员初始化(default memberwise initialization),缺省是因为它自动发生,无论我们是否提供显式构造函数,按成员是

实验11:Problem D: 分数类的模板数组类

在默认构造函数里面,分母的默认值不能为0!! Home Web Board ProblemSet Standing Status Statistics Problem D: 分数类的模板数组类 Problem D: 分数类的模板数组类 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 509  Solved: 350[Submit][Status][Web Board] Description 封装一个模板数组类Array,支持一下操作: 1. 构造函

模板类和模板函数的声明和定义分开文件写的方法

据说模板类和模板函数的声明和定义要写在同一个文件. 不然编译会出现"未定义的引用". 其实是有解决方法的. 模板类 template class CNNConvLayer<double>; 就是 template class className<typeName>; 模板函数 template void poolBackPropForKernal<double>(double*, double*, int, int, double*, double*

函数模板与模板函数及模板类与模板的特化

函数模板( Function templates) * 模板(Templates)使得我们可以生成通用的函数,这些函数能够接受任意数据类型的参数,可返回任意类型的值,而不需要对所有可能的数据类型进行函数重载.这在一定程度上实现了宏(macro)的作用.它们的原型定义可以是下面两种中的任何一个: template <class identifier> function_declaration; template <typename identifier> function_decla

浅蓝色设计类网站模板

浅蓝色设计类网站模板是一款高端大气的设计css3企业网站模板. 模板地址:http://www.huiyi8.com/sc/8673.html

45 puppet基础、资源详解、配置语言、puppet类与模板及模块

01 puppet基础 配置: node1:192.168.1.131 CentOS7.2 node2:192.168.1.132 CentOS7.2 [[email protected] ~]# rpm -ivh epel-release-latest-7.noarch.rpm [[email protected] ~]# yum list all | grep -i "puppet" puppet.noarch                           3.6.2-3.e

JDBC之——一个单线程JDBC基类和一些注意事项

下面的一个DBase基类提供了一些jdbc的基本操作,配置文件的配置部分并不准确,只是在自己机器上的mysql中测试过.. 数据库的增删改方法中都在开始调用了getConnection方法,末尾调用了Close方法:数据库的查询中没有调用close方法,因为一旦调用了close方法,就无法用RecodeSet操作查询结果了,所以在调用了查询方法后,要调用close方法,防止出现 too many connections 错误. 此外,DBase中的所有对象都是static的,所以在使用时不要调用