1.类和结构体,只有的默认访问权限的区别

2.类内不能定义和类外类型名相同的类型名。为什么?typedef机制?

typedef double money;
class Account
{
private:
typedef double money;//❌
}

3.变量名一致时的调用(不推荐相同的变量名)

pos height;
class Screen {
void Screen::dummy_fcn(pos height);
private:
pos cursor = ,height=, width=;
}
void Screen::dummy_fcn(pos height)
{
cursor=width*height;//传入参数
cursor=width*this->height;//成员
cursor=width*Screen::height;//成员
cursor=width*::height;//全局变量
}

4.初始化和赋值的区别

class ConstRef{
public:
ConstRef(int ii);
private:
int I;
const int ci;
int &ri;
}
ConstRef:: ConstRef(int ii){
I=ii;
ci=ii;//错误
ri=i; //错误
} ConstRef:: ConstRef(int ii):I(ii),ci(ii), ri(i) { }//正确

5.初始化列表的顺序与参数定义的顺序一致

class X {
int i;
int j;
public:
X(int val):j(val),i(j){}//本想val->j->i,实际是:j->i,val->j
}

6.默认构造函数、委托构造函数、合成的默认构造函数

class Sales_data{
Sales_data(std::string s, unsigned int, double price): bookNo(s), units_sold(cnt), revenue(int*price) { }
Sales_data():Sales_data(" ",,){ }//委托构造函数
}

6.1 三五法则

  • 三个控制类拷贝的基本操作:拷贝构造函数;赋值拷贝运算符;析构函数
//类值的类
class HasPtr {
public:
HasPtr(const std::string &s=std::string()): ps(new std::string(s)),i() {}//构造函数1
HasPtr(const HasPtr &p):ps(new std::string(*p.ps)),i(p.i){} //构造函数2
HasPtr &operator=(const HasPtr &);//赋值拷贝运算符 ~HasPtr() { delete ps; }//此虚构函数必须同时定义一个对应的构造函数和拷贝复制运算符 private:
std::string *ps;
int i;
};

需要析构函数的类也需要赋值和拷贝操作;

需要赋值操作的类也需要拷贝操作,反之亦然;

    HasPtr f(HasPtr hp)//传值,拷贝
{
HasPtr ret = hp;//再拷贝
return ret;//ret和hp都被销毁
}
HasPtr p("something");
f(p);//f结束,p.ps被销毁
HasPtr q(p);//p 和 q都指向无效内存---------------->如何解决?

7.默认初始化、值初始化

7.1 默认初始化

  • 不使用初值定义非静态变量 int i;
  • 类成员为类类型,使用合成的默认构造函数时?
  • 没有在构造函数中显示初始化时

7.2 值初始化

  • 数组初始化中,提供的值数量少于数组大小
  • 不使用初始值定义局部静态变量
  • 通过T()显式求是初始化

8.当类只含有内置类型或复合类型的成员时,编译器是不会为类合成默认构造函数的。因为:内置类型可以有自己的默认初始化,复合类型有给出的显示的构造函数进行初始化(如果没给,而复合类型中的成员又不是内置类型,说白了,找不到初始值的话,就会报错)

8.1 B()没有给b_member初值

8.2 去NoDefault里找初值。发现NoDefault的构造函数里也没有给初值:报错

9.聚合类

所有成员public,没有构造函数,没有类内初值,没有基类,没有virtual函数

10.字面值常量类

11.类的静态成员

  • 静态成员可以是不完全类型,可以是类本身(指针也可以,但普通数据成员不行)
  • 静态成员可以作为默认实参(因为可以提取值,但普通成员不行)

12.析构

  • 析构函数不接受参数,不能被重载
  • 隐式销毁一个内置指针类型,不会delete它所指向的对象(智能指针会?)
  • 如果一个类需要自定义析构函数,那它也需要自定义拷贝构造函数、拷贝赋值运算符

13.阻止拷贝-delete(不用private是因为友元可以访问)

struct NoCopy {
NoCopy() = default; //使用合成的默认构造函数
NoCopy(const NoCopy&) = delete; //阻止拷贝//不要声明为private
NoCopy &operator = (const NoCopy&) = delete;//阻止赋值//不要声明为private,成员函数、友元函数调用会出错
~NoCopy() =default;//如果是delete,就不能销毁其对象了
};
  • 类成员的析构函数是delete或private,则合成的析构函数将会是delete
  • ------------拷贝构造------------------------,----------拷贝构造------------------
  • ------------析构函数------------------------,----------拷贝构造------------------
  • ------------拷贝赋值运算符是delete或private或const &,----------拷贝赋值运算符----------------
  • ------------析构函数是delete或private,或有引用成员且没有类内初始化器,或有const成员且类型未显示定义默认构造函数,则合成的默认构造函数将会是delete
  • 析构函数不能是delete

13.拷贝控制和资源管理:

13.1 行为像值的类:有自己的状态,完全独立。

//类值的类
class HasPtr {
public:
HasPtr(const std::string &s=std::string()): ps(new std::string(s)),i() {}//构造函数1
HasPtr(const HasPtr &p):ps(new std::string(*p.ps)),i(p.i){} //构造函数2
HasPtr& operator=(const HasPtr &);//赋值拷贝运算符
~HasPtr() { delete ps; }//此虚构函数必须同时定义一个对应的构造函数和拷贝复制运算符
private:
std::string *ps;
int i;
};
HasPtr& HasPtr::operator=(const HasPtr &rhs)
{
auto newp = new string(*rhs.ps);//为了避免rhs和*this是同一个对象
delete ps;
ps = newp;
i = rhs.i;
return *this;
}

13.2 行为像指针的类:共享状态,改变副本即改变原值。(对原值进行不同状态下的操作)

最好的办法:shared_ptr

直接管理资源:引用计数(存放在哪里——动态内存)

//类指针的类
class HasPtr {
public:
HasPtr(const std::string &s=std::string()): ps(new std::string(s)),i(),use(new std::size_t()) {}//构造函数1
HasPtr(const HasPtr &p) :ps(new std::string(*p.ps)), i(p.i), use(p.use) { ++*use; } //构造函数2
HasPtr& operator=(const HasPtr &);//赋值拷贝运算符 ~HasPtr() {
if (--*use == )
{
delete ps;
delete use;
}//此虚构函数必须同时定义一个对应的构造函数和拷贝复制运算符
} private:
std::string *ps;
int i;
std::size_t *use;//引用计数
};
HasPtr& HasPtr::operator=(const HasPtr &rhs)
{
++ *rhs.use;//增加右侧对象的引用计数
if (--*use == )//先减少原本对象的引用计数(可能本来是别的对象,更改之后就要把原来的减一)
{
delete ps;
delete use;
}
//拷贝
ps = rhs.ps;
i = rhs.i;
use = rhs.use;
return *this;
}

涉及资源管理的操作:构造、赋值、析构、交换(适合指针)

C++——类的更多相关文章

  1. Java类的继承与多态特性-入门笔记

    相信对于继承和多态的概念性我就不在怎么解释啦!不管你是.Net还是Java面向对象编程都是比不缺少一堂课~~Net如此Java亦也有同样的思想成分包含其中. 继承,多态,封装是Java面向对象的3大特 ...

  2. C++ 可配置的类工厂

    项目中常用到工厂模式,工厂模式可以把创建对象的具体细节封装到Create函数中,减少重复代码,增强可读和可维护性.传统的工厂实现如下: class Widget { public: virtual i ...

  3. Android请求网络共通类——Hi_博客 Android App 开发笔记

    今天 ,来分享一下 ,一个博客App的开发过程,以前也没开发过这种类型App 的经验,求大神们轻点喷. 首先我们要创建一个Andriod 项目 因为要从网络请求数据所以我们先来一个请求网络的共通类. ...

  4. ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第二章:利用模型类创建视图、控制器和数据库

    在这一章中,我们将直接进入项目,并且为产品和分类添加一些基本的模型类.我们将在Entity Framework的代码优先模式下,利用这些模型类创建一个数据库.我们还将学习如何在代码中创建数据库上下文类 ...

  5. ASP.NET Core 折腾笔记二:自己写个完整的Cache缓存类来支持.NET Core

    背景: 1:.NET Core 已经没System.Web,也木有了HttpRuntime.Cache,因此,该空间下Cache也木有了. 2:.NET Core 有新的Memory Cache提供, ...

  6. .NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类

    .NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类 0x00 为什么要引入扩展方法 有的中间件功能比较简单,有的则比较复杂,并且依赖其它组件.除 ...

  7. Java基础Map接口+Collections工具类

    1.Map中我们主要讲两个接口 HashMap  与   LinkedHashMap (1)其中LinkedHashMap是有序的  怎么存怎么取出来 我们讲一下Map的增删改查功能: /* * Ma ...

  8. PHP-解析验证码类--学习笔记

    1.开始 在 网上看到使用PHP写的ValidateCode生成验证码码类,感觉不错,特拿来分析学习一下. 2.类图 3.验证码类部分代码 3.1  定义变量 //随机因子 private $char ...

  9. C# 多种方式发送邮件(附帮助类)

    因项目业务需要,需要做一个发送邮件功能,查了下资料,整了整,汇总如下,亲测可用- QQ邮箱发送邮件 #region 发送邮箱 try { MailMessage mail = new MailMess ...

  10. .NET平台开源项目速览(18)C#平台JSON实体类生成器JSON C# Class Generator

    去年,我在一篇文章用原始方法解析复杂字符串,json一定要用JsonMapper么?中介绍了简单的JSON解析的问题,那种方法在当时的环境是非常方便的,因为不需要生成实体类,结构很容易解析.但随着业务 ...

随机推荐

  1. (转)使用OpenGL显示图像(二)定义Shapes

    定义形状 编写:jdneo - 原文:http://developer.android.com/training/graphics/opengl/shapes.html 在一个OpenGL ES Vi ...

  2. cs224d 作业 problem set2 (一) 用tensorflow纯手写实现sofmax 函数,线性判别分析,命名实体识别

    Hi Dear Today we will use tensorflow to implement the softmax regression and linear classifier algor ...

  3. 创建线程方法&守护线程

    创建线程方法1. class mythread extends Thread{ 重写run方法 } mythread m=new mythread () 启动:m.start() 创建线程方法2. c ...

  4. redis的快速机制与数据类型

    想一下 redis 的高并发和快速 单线程模型 - 避免了不必要的上下文切换和竞争条件(锁) Redis客户端对服务端的每次调用都经历了发送命令,执行命令,返回结果三个过程.其中执行命令阶段,由于Re ...

  5. mongo import excle

    mongoimport --host 192.*******.** --db **  --collection **  --type csv --headerline --file /*****.cs ...

  6. 好947 Mybatis 配置resultMap 带參数查询Map 注意selectOne数据库返回结果一条数据库 否则会报错

    //TMD 写几个demo 还有大站採集 <a target=_blank href="http://hao947.com/" target="_blank&quo ...

  7. 【Spring】每个程序员都使用Spring(四)——Aop+自定义注解做日志拦截

    一.前言 上一篇博客向大家介绍了Aop的概念,对切面=切点+通知 .连接点.织入.目标对象.代理(jdk动态代理和CGLIB代理)有所了解了.理论很强,实用就在这篇博客介绍. 这篇博客中,小编向大家介 ...

  8. Windows IIS7 下安装配置 PHP7.0

    确认Microsoft Visual C++版本 Microsoft Visual C++的版本至关重要,根据Microsoft Visual C++版本下载的PHP不同.        PHP官网的 ...

  9. Chrome不支持css字体小于12px的解决办法

    我们先来看个效果图(chrome下): 从上面的图可以很明显地看出Chrome下css设置字体大小为12px及以下时,显示的都是一样大小,都是默认12px: 那么网上有一个方法就是给当前样式添加Chr ...

  10. HTML + CSS (上)

    HTML 概念: 超文本标记语言. 核心: 语义. 主体结构: <!doctype html> //告诉浏览器这是什么语言 html //主体 head //头文件 body //页面主体 ...