Primer随笔

Day1

   如果成员是const 、引用,或者属于某种未提供默认构造函数的类类型,我们必须通过构造函数初始化值列表为这些成员提供初始值。

  例如:

    class ConstRef{

    public:

        ConstRef(int ii);

    private:

        int i;

        const int ci;

        int &ri;

    }

    ConstRef::ConstRef(int ii){

      i = ii;

      ci = ii;  ( 错误 不能赋值)

      ri = ii;  (ri没有被初始化)

    }

    ConstRef::ConstRef(int ii):i(ii),ci(ii),ri(ii){}(正确)

    这里也体现了数据成员的初始化和赋值之间的差异

    编译器创建的构造函数又称为合成构造函数

    初始化的顺序没有什么要求,但是如果一个成员使用另一个成员来初始化的话,就要考虑初始化的顺序了。

    但是尝试primer习题中的这个例子 发现编译过程并没有报错,按照书上的说法是先构造a 会有问题。 环境Vs2010   

    struct X {
    X(int i , int j):b(j),a(b%i){}
    int a,b;
    };

    C11新增委托构造函数

    

    构造函数,在实例化的过程中会调用,所以有些情况下,没有默认构造函数,编译还是可以过的。

    只允许一步类类型转换

    例如 a接受string类型的参数构造 那么b=a("tempconstructor") 错误 string c = "tmpconstructor" b=a(c) 正确

    可以用explicit抑制构造函数定义的隐式转换(explicit只能出现在类内声明处) 只能直接初始化 不接受拷贝形式初始化

    a{

      explicit a(string b){}

     }

     那这时上述构造方式都会有问题

时间: 2024-10-11 07:33:43

Primer随笔的相关文章

C++ Primer 随笔 Chapter 4 数组和指针

1.数组:数组是由类型名.标识符和维数组成的符合数据类型,类型名规定了存放在数组中的元素类型,维数规定数组中包含元素的个数而标识符就是数组的名称.例如: int  arr[10]; 其中 int 是类型名,arr是标识符而 10 是数组的维数. 2.数组的定义和初始化:数组的初始化要注意以下几点 (1). 数组中存放的元素类型不能是引用类型,除此之外可以是其他任何类型. (2). 数组的维数必须是字面值常量.枚举常量或者常量表达式(但不能是在运行时才知道其值得常量表达式) (4). 显示初始化整

c++ primer随笔

1. 把int变量直接赋值给指针是错误的操作,即使int变量的值恰好等于0也不行. 2. 建议初始化所有指针. 3. 引用本身并不是一个对象,一旦定义了引用,就无法绑定其他对象,之后每次使用这个引用都是访问它最初绑定的那个对象.引用不是对象,只是为一个已经存在的对象所起的另一个名字. 4. 指针本身是一个对象,允许对指针赋值和拷贝,在指针的生命周期内可以指向几个不同的对象:引用不是一个对象,无法令引用重新绑定到另外一个对象. 5. 指针无须在定义时赋初值,在快作用域内定义的指针如果没有被初始化,

C primer plus 学习随笔

数据类型 int类型  printf()输出八进制整数时,用%o代替%d,输出十六进制时,用%x. %#o.%#x和%#X分别生成0.0x.0X前缀. 1 #include <stdio.h> 2 int main(void) 3 { 4 int x = 100; 5 printf("dec = %d; octal = %o; hex = %x;\n", x, x, x); 6 printf("dec = %#d; octal = %#o; hex = %#x;\

C primer plus 学习随笔(2)

字符串和格式化输入/输出 空字符 C的字符串存储时通常以空字符("\0")结束.该字符的存在意味着数组的单位数必须至少比要存储的字符数多1. 使用字符串 %s告诉printf()要打印一个字符串. scanf()开始读取输入以后,会在遇到第一个空白字符空格(blank).制表符(tab)或者换行符(newline)处停止读取.一般情况下,使用%s的scanf()只会把一个单词而不是把整个语句作为字符串读入.C使用其他读取输入函数(例如gets())来处理一般的字符串. strlen()

C++ primer第五版随笔--2015年1月6日

记录自己看这本书时的一些内容. 一.引用(reference) 引用为对象起了另外一个名字.例如: int ival=1024: int &relVal1=ival;//对,注意尽量不要用这方式:int& relval=ival: int &relVal2;//报错,引用必须被初始化 在定义引用时,程序把引用和它的初始值绑定(binding)在一起,而不是将初始值拷贝给引用.一旦初始化完成,引用将和它的初始值对象始终绑定在一起.因为无法令引用重新绑定到另外一个对象,因此引用必须初始

C++ Primer 第四版课后练习解答 习题1.1

注意:本随笔是在<C++Primer(第四版)习题解答(完整版)>中直接抄录的.此处主要是便于本人以后反复阅读. 习题1.1 查看所用的编译器文档,了解它所用的文件命名规范.编译并运行本节的main程序. [解答] 一般而言,C++编译器要求编译的程序保存在文件中.C++程序一般涉及两类文件:头文件和源文件.大多数系统中,文件的名字由文件名和文件后缀(又称扩展名)组成.文件后缀通常表明文件的类型,如头文件的后缀可以是.h或.hpp等:源文件和后缀可以是.cc或.cpp等,具体的后缀与使用的编译

C++ Primer 第四版课后练习解答 习题1.13

注意:本随笔是直接参考<C++Primer(第四版)习题解答(完整版)>中的.此处主要是便于本人以后反复阅读. 习题1.13 编译器不同,理解其诊断内容的难易程度也不同.编写一些程序,包含本小节"再谈编译"部分讨论的那些常见错误.研究编译器产生的信息,这样你在编译更复杂的程序遇到这些信息时不会陌生. [解答] 对于程序中出现的错误,编译器通常会给出简略的提示信息,包括错误出现的文件及代码行.错误代码.错误性质的描述.如果要获得关于错误的详细信息,一般可以根据编译器给出的错误

C++ Primer 第四版课后练习解答 习题1.2

注意:本随笔是在<C++Primer(第四版)习题解答(完整版)>中直接抄录的.此处主要是便于本人以后反复阅读. 习题1.2 修改程序使其返回-1.返回值-1通常作为程序运行失败的指示器.然而,系统不同,如何(甚至是否)报告main函数运行失败也不同.重新编译并再次运行程序,看看你的系统如何处理main函数的运行失败指示器. [解答]笔者所使用的Windows操作系统并不报告main函数的运行失败,因此,程序返回-1或返回0运行效果上没有什么区别.但是,如果在DOS命令提示符方式下运行程序,然

C++ Primer 第四版课后练习解答 习题1.3

注意:本随笔是在<C++Primer(第四版)习题解答(完整版)>中直接抄录的.此处主要是便于本人以后反复阅读. 习题1.3 编一个程序,在标准输出上打印"Hello,World". [解答] 1 #include <iostream> 2 3 int main() 4 { 5 std::cout << "Hello,World" << std::endl; 6 return 0; 7 } 本人代码示例: 1 #inc