C++ 第三十四天
Ⅰ、有时不得不用到“构造函数初始值列表”,原因是有些编译器不支持类内初始值,这样做可以避免在函数体内初始化。
需要注意的是:被初始化列表忽略的数据成员将被默认初始化(结果取决于位置,可能产生可怕后果)。下面是构造器的 N 种情况:
- 程序员直接忽略构造器 --> 产生默认合成的构造函数 --> 成员被默认初始化 --> 不确定的结果。
- 给数据成员提供初始值(Java 中所谓的属性初始化),不写构造函数 --> 默认合成的构造函数使用提供的初始值初始化对应的成员 --> 被忽略的成员被默认初始化。
- 不使用类内初始值,而采用构造函数初始值列表 --> 被忽略的成员被默认初始化。、
- ·····
记一下比较好的实践:提供类内初始值 + 显示地初始化没有类内初始值的每个成员。
总结起来就是:确保每个成员在创建后都有一个确定的值,但是又不要重复初始化(重复初始化:类内初始值与构造函数赋值相同)。
Ⅱ、拷贝、赋值、析构也是有合成版本的!
如果没写的话,编译器都会替我们做,但是某些情形我们不能依赖合成的版本:
那就是 - 管 - 理 - 动 - 态 - 内 - 存 的类!!!( 包含 string 和 vector 的类除外)
方法论总结:
- 通常情况下都不需要手动去写。
- 在合适的情况下,尽可能用 string 和 vector 来动态分配内存!
Ⅲ、友元函数需要在类外部再专门进行一次声明。举例:
class.h
#ifndef CLASS_H_INCLUDED
#define CLASS_H_INCLUDED class Person {
friend int getNo(const Person&);
private:
int no = ;
}; int getNo(const Person&); // necessary #endif
class.cpp
#include "class.h"
int getNo(const Person& x) {
return x.no;
}
main.cpp
#include "class.h"
#include <stdio.h> int main()
{
Person p;
printf("%d\n", getNo(p));
return ;
}
运行结果:
root@iZwz9f8i2ttdoht64eezprZ:~/cprg# g++ -std=c++ main.cpp class.cpp
root@iZwz9f8i2ttdoht64eezprZ:~/cprg# ./a.out
相关阅读:
C++ 第三十四天的更多相关文章
- COJ966 WZJ的数据结构(负三十四)
WZJ的数据结构(负三十四) 难度级别:C: 运行时间限制:20000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 给一棵n个节点的树,请对于形如"u ...
- NeHe OpenGL教程 第三十四课:地形
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- JAVA之旅(三十四)——自定义服务端,URLConnection,正则表达式特点,匹配,切割,替换,获取,网页爬虫
JAVA之旅(三十四)--自定义服务端,URLConnection,正则表达式特点,匹配,切割,替换,获取,网页爬虫 我们接着来说网络编程,TCP 一.自定义服务端 我们直接写一个服务端,让本机去连接 ...
- Java进阶(三十四)Integer与int的种种比较你知道多少?
Java进阶(三十四)Integer与int的种种比较你知道多少? 前言 如果面试官问Integer与int的区别:估计大多数人只会说到两点:Ingeter是int的包装类,注意是一个类:int的初值 ...
- Gradle 1.12用户指南翻译——第三十四章. JaCoCo 插件
本文由CSDN博客万一博主翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...
- SQL注入之Sqli-labs系列第三十四关(基于宽字符逃逸POST注入)和三十五关
开始挑战第三十四关和第三十五关(Bypass add addslashes) 0x1查看源码 本关是post型的注入漏洞,同样的也是将post过来的内容进行了 ' \ 的处理. if(isset($_ ...
- spring boot 常见三十四问
Spring Boot 是微服务中最好的 Java 框架. 我们建议你能够成为一名 Spring Boot 的专家. 问题一 Spring Boot.Spring MVC 和 Spring 有什么区别 ...
- “全栈2019”Java多线程第三十四章:超时自动唤醒被等待的线程
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- 第三百三十四节,web爬虫讲解2—Scrapy框架爬虫—Scrapy爬取百度新闻,爬取Ajax动态生成的信息
第三百三十四节,web爬虫讲解2—Scrapy框架爬虫—Scrapy爬取百度新闻,爬取Ajax动态生成的信息 crapy爬取百度新闻,爬取Ajax动态生成的信息,抓取百度新闻首页的新闻rul地址 有多 ...
- “全栈2019”Java第三十四章:可变参数列表
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
随机推荐
- GO项目目录
|--bin |--pkg |--src 其中,bin存放编译后的可执行文件:pkg存放编译后的包文件:src存放项目源文件.一般,bin和pkg目录可以不创建,go命令会自动创建(如 go inst ...
- php事件钩子
PHP中钩子函数的实现与认识: http://rmingwang.com/set-php-hooks.html 1.钩子函数是预设并在特定的条件下触发的. 2.钩子函数接管程序后可以影响到程序的走向 ...
- ios UITableView中Cell重用机制导致内容重复解决方法
UITableView继承自UIScrollview,是苹果为我们封装好的一个基于scroll的控件.上面主要是一个个的 UITableViewCell,可以让UITableViewCell响应一些点 ...
- web测试点--摘录
转载地址:Web测试到底是在测什么 一.输入框 1.字符型输入框: (1)字符型输入框:英文全角.英文半角.数字.空或者空格.特殊字符“~!@#¥%……&*?[]{}”特别要注意单引号和&am ...
- linux中常见命令操作(转)
1.日常操作命令 **查看当前所在的工作目录pwd **查看当前系统的时间 date **查看有谁在线(哪些人登陆到了服务器)who 查看当前在线last 查看最近的登陆历史记录 2.文件系统操作** ...
- 使用Ansible自动配置Nginx服务
1.首先安装好Ansible环境,具体步骤请见Ansible安装 2.先创建hosts文件(为后面编写脚本安装JDK做铺垫) [root@localhost /]# vi hosts [jdktest ...
- /usr/local/nginx/sbin/nginx -s reload 失败原因pid 进程记录和当前不符
[root@a ~]# /usr/local/nginx/sbin/nginx -s reload;nginx: [alert] kill(18834, 1) failed (3: No such p ...
- 转:java高并发学习记录-死锁,活锁,饥饿
死锁 两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去. 为什么会产生死锁: ① 因为系统资源不足. ② 进程运行推进的顺序不合适. ③ ...
- SIP UserAgent (B2BUA client)——linphonec
1.linphone编译 linphone一般用在android/ios/windows/mobile上,但是没有图形界面的linphonec命令行程序用在资源紧张的硬件平台上也跟pjsip命令行一样 ...
- C的指针疑惑:C和指针13(高级指针话题)上
int *f(); f为一个函数,返回值类型是一个指向整形的指针. int (*f)(); 两对括号,第二对括号是函数调用操作符,但第一对括号只起到聚组的作用. f为一个函数指针,它所指向的函数返回一 ...