c++primer学习笔记chapter1~4

1.int long short等,只规定了最小的字节为多少,具体和操作系统以及编译器有关系,#include头文件中规定了最大的值是多少

    int a=INT_MAX;
    short  b=SHRT_MAX;
    long c=LONG_MAX;
    long long d=LLONG_MAX;
    cout << a << endl << b << endl << c << endl << d << endl;

2.没有初始化会怎么样?

如果不对变量进行初始化,那么值为变量被创建之前的内存单元的值,不确定的;

3.如果超出变量最大的范围会怎么样?

    int a=INT_MAX;
    cout << a << endl;
    a++;
    cout << a << endl;
2147483647
-2147483648
    unsigned int a=0;
    cout << a << endl;
    a--;
    cout << a << endl;
0
4294967295

4.char 的存储,char类型在内存单元中存的是ASC码,但是输出的时候因为cout 的作用所以输出字符;

     char ch=‘M‘;
     cout << ch << endl;
     cout.put(ch);
     cout << endl;
     int i=ch;
     cout << i << endl;
M
M
77

5.转意字符 \

    cout << "hello \"world!" << endl;
hello "world!

6.const 为什么比define好?

能够明确指定的类型;

利用c++的作用域规则将定义限制在特定的函数中;

const可以用于更复杂的类型;

7.小小数的问题

    double a=3.14E2;
    cout << a << endl;
    double b=3.14e-1;
    cout << b << endl;
314
0.314

float 和double 是精度的差异:

 float a=3.14E23;
    float b=a+1;
    cout << b-a  << endl;
0

因为float的精度就是前6或者7位,后面的位数加上或者减去对他没有影响,所以结果为0;

8 . 除法

    int a=10/3;
    cout << a << endl;
    double b=10/3;
    cout << b << endl;
    b=10/3.0;
    cout << b << endl;
    b=10.0/3;
    cout << b << endl;
3
3
3.33333
3.33333

9.数组init中的几种情况

    int a[3]={1,2,3};
    cout << sizeof(a[0]) << endl;
    cout << sizeof(a) << endl;
    int b[3]={0};
    cout << b[2] << endl;
    int c[3]={1};
    cout << c[0] << " " << c[1] << endl;
    int d[]={1,2,3,4};
    cout << sizeof(d)/sizeof(d[0]) << endl;
4
12
0
1 0
4

10.字符串

    char  ch=83;
    cout << ch << endl;
    char *ch1="S";
    cout << ch1 <<endl;
S
S

“S”不是字符常量,它表示’S”\0’两个字符的字符串。“S”其实表示字符串的地址;

11 cin.get() cin.getline()的问题

 都是读一行,读到\n结束;
 但是cin.get()将换行符号仍然放在输入队列中,尔cin.getline()舍弃;
 eg:
cin.get(name,20);
 cin.get(add,20);
 //没来得及输入就直接跳出来了,因为上一次\n还在输入队列中,这次以为是空的字符串

改为这样又可以顺利读入

  cin.getline(name,20);
  cin.get(add,20);

读入的拼接方法:

    cin.get(name,20).get();
    cin.get(add,20);//这样可以成功输入

接着几个拼接的例子:

 cin.getline(name,20).get(add,20);
    cin >> name;
    cin.get(add,20);

不能输入,因为cin 输入之后回车键生成的换行符号留在了输入队列中,所以,cin.get以为是空字符串,直接读取了。

    cin >> name;
    cin.get();
    cin.get(add,20);

等效于

    (cin >> name).get();
    cin.get(add,20);
     getline(cin , str);没有长度限制

12.string 类,直接“加减”

   char name[]="vd";
    cout << strlen(name) << endl;
    string add="vd";
    cout << add.size() << endl;

13.结构体:

       struct node
       {
       int a;
       int b;
       } ;
       node hello={1,2};
       cout << hello.a << endl;

c++不提倡外部变量,但是提倡使用外部结构体声明;

结构体直接可以复制:

       struct node
       {
       int a;
       int b;
       } ;
       node hello={1,2};
       node world=hello;

可以缺省struct 的名字:

       struct
       {
       int a;
       int b;
       } hello;
       hello={1,2};
       cout << hello.a << endl;

14.指针

在c++中int* 作为一种类型,但是申请多个的时候还是应该

   int* p,*q;

而不是

    int* p,q;

避免野指针,一定要在*解引用之前知道指针确定的指向;

    int* p;
    *p=123;
这种做法是危险的

给指针赋地址:

    int* p;
    *p=0xxxxxxx;//WA
    *p=(int *) 0xffffff//AC
时间: 2024-12-07 22:16:04

c++primer学习笔记chapter1~4的相关文章

C++ Primer 学习笔记_98_特殊工具与技术 --优化内存分配

特殊工具与技术 --优化内存分配 引言: C++的内存分配是一种类型化操作:new为特定类型分配内存,并在新分配的内存中构造该类型的一个对象.new表达式自动运行合适的构造函数来初始化每个动态分配的类类型对象. new基于每个对象分配内存的事实可能会对某些类强加不可接受的运行时开销,这样的类可能需要使用用户级的类类型对象分配能够更快一些.这样的类使用的通用策略是,预先分配用于创建新对象的内存,需要时在预先分配的内存中构造每个新对象. 另外一些类希望按最小尺寸为自己的数据成员分配需要的内存.例如,

C++ Primer 学习笔记_73_面向对象编程 --再谈文本查询示例

面向对象编程 --再谈文本查询示例 引言: 扩展第10.6节的文本查询应用程序,使我们的系统可以支持更复杂的查询. 为了说明问题,将用下面的简单小说来运行查询: Alice Emma has long flowing red hair. Her Daddy says when the wind blows through her hair, it looks almost alive, like a fiery bird in flight. A beautiful fiery bird, he

C++ Primer 学习笔记_74_面向对象编程 --再谈文本查询示例[续/习题]

面向对象编程 --再谈文本查询示例[续/习题] //P522 习题15.41 //1 in TextQuery.h #ifndef TEXTQUERY_H_INCLUDED #define TEXTQUERY_H_INCLUDED #include <iostream> #include <fstream> #include <sstream> #include <vector> #include <set> #include <map&g

C++ Primer 学习笔记_19_类与数据抽象(5)_初始化列表(const和引用成员)、拷贝构造函数

C++ Primer 学习笔记_19_类与数据抽象(5)_初始化列表(const和引用成员).拷贝构造函数  从概念上将,可以认为构造函数分为两个阶段执行: 1)初始化阶段: 2)普通的计算阶段.计算阶段由构造函数函数体中的所有语句组成. 一.构造函数初始化列表 推荐在构造函数初始化列表中进行初始化 1.对象成员及其初始化 <span style="font-size:14px;">#include <iostream> using namespace std;

C++ Primer 学习笔记_14_标准模板库_bitset位集合容器

C++ Primer 学习笔记_14_标准模板库_bitset位集合容器 bitset容器是一个bit位元素的序列容器,每个元素只占一个bit位,取值为0或1,因而很节省内存空间.下图是一个bitset的存储示意图,它的10个元素只使用了两个字节的空间. 使用bitset需要声明头文件"#include <bitset>" 1.创建bitset对象 创建bitset对象时,必须要指定容器的大小.bitset对象的大小一经定义,就不能修改了.下面这条语句就定义了bitset对

C++ Primer 学习笔记_23_标准模板库_stack.

C++ Primer 学习笔记_11_标准模板库_stack.queue队列容器与priority_queue优先队列容器 1.stack堆栈 stack堆栈是一个后进先出(Last In First Out,LIFO)的线性表,插入和删除元素都只能在表的一端进行.插入元素的一端称为栈顶,而另一端称为栈底.插入元素叫入栈(Push),删除元素叫出栈(Pop).下图是堆栈示意图 堆栈只提供入栈,出栈,栈顶元素访问和判断是否为空等几种方法.采用push()方法将元素入栈:采用pop()方法出栈:采用

C++primer学习笔记(二)——Chapter 4

4.1  Fundamentals 1.Basic Concepts (1)操作符分为一元,二元或者三元操作符: (2)复杂的表达式中含有很多操作符时: 规则一:分为不同的级别,级别高的先运行: 规则二:相同级别的操作符有执行顺序的确定: (3)操作符可以改变操作数的类型 一般将级别低的转化成级别高的 (4)重载运算符 相同的运算符在对不同类型的对象进行操作的时候,会有不同的功能: (5)Lvalue和Rvalue 显而易见:Lvalue指的是Left value,Rvalue指的是Right

C++ Primer 学习笔记_104_特殊工具与技术 --嵌套类

特殊工具与技术 --嵌套类 可以在另一个类内部(与后面所讲述的局部类不同,嵌套类是在类内部)定义一个类,这样的类是嵌套类,也称为嵌套类型.嵌套类最常用于定义执行类. 嵌套类是独立的类,基本上与它们的外围类不相关,因此,外围类和嵌套类的对象是互相独立的.嵌套类型的对象不具备外围类所定义的成员,同样,外围类的成员也不具备嵌套类所定义的成员. 嵌套类的名字在其外围类的作用域中可见,但在其他类作用域或定义外围类的作用域中不可见.嵌套类的名字将不会与另一作用域中声明的名字冲突 嵌套类可以具有与非嵌套类相同

C++ Primer 学习笔记_102_特殊工具与技术 --运行时类型识别[续]

特殊工具与技术 --运行时类型识别[续] 三.RTTI的使用 当比较两个派生类对象的时候,我们希望比较可能特定于派生类的数据成员.如果形参是基类引用,就只能比较基类中出现的成员,我们不能访问在派生类中但不在基类中出现的成员. 因此我们可以使用RTTI,在试图比较不同类型的对象时返回假(false). 我们将定义单个相等操作符.每个类定义一个虚函数 equal,该函数首先将操作数强制转换为正确的类型.如果转换成功,就进行真正的比较:如果转换失败,equal 操作就返回 false. 1.类层次 c