C++代码复习笔记:第三章

  getline这个方法的使用, 可以获取用户输入的一行数据, 保存到数组中:

#include <iostream>
#include <string>
int main() {
    using namespace std;
    // string s;
    // getline(cin, s);
    // cout << s << endl;
    const int size = 4;
    string strs[size];
    for(int i=0; i<size; i++) {
        getline( cin, strs[i] );
    }
    for(int i=0; i<size; i++) {
        cout << strs[i] << endl;
    }
    return 0;
}

  使用内置类, 计算字符串的长度:

#include <iostream>
#include <cstring>
int main() {
    using namespace std;
    char str[] = "abcd";
    cout << strlen(str) << endl;
    return 0;
}

  C++模版类, 和java泛型差不多 , C语言是没有模版类这一说的, C++中新增了模版:

#include <iostream>
#include <string>
#include <array>

int main() {
    using namespace std;
    const int SIZE = 4;
    array<string, SIZE> *p;
    for(int i=0; i<SIZE; i++) {
        cout << "enter number" << endl;
        cin >> (*p)[i];
        cout << "" << endl;
    }
    return 0;
}

  数字指针, 在实际上,如果一个函数返回指针没有啥意义,因为, 如果函数内部要返回指针,那么这个指针必须是外部传递进来的参数,如果是内部创建指针, 当函数执行结束的时候, 内部指针自然会被销毁;

#include <iostream>
#include <string>
#include <array>
int* run(int *n) {
    *n = (*n)*100;
    return n;
}
int main() {
    int number = 100;
    int *n = run(&number);
    std::cout << *n << std::endl;
    return 0;
}

  指针的写法非常多,稍微不同的写法,代表的意义可能天差地别, 以下的(*p)[0]是指获取数组的第一个值 , 但是*p[0]的意思却完全不同了:

    std::array<int,4> *p;
    (*p)[0] = number;

  函数指针

#include <iostream>
#include <string>
#include <array>
void show(int a, int b) {
    using namespace std;
    cout << a+b <<endl;
}
int main() {
    void (*p)(int, int);
    p = show;
    (*p)(1,2);
    return 0;
}

  函数指针

#include <iostream>
using namespace std;
void show(int num) {
    cout << num*10000 << endl;
}
void brige(int num, void (*p)(int) ) {
    p(num);
}
int main() {
    int number;
    cout << "enter number" << endl;
    cin >> number;
    brige(number, show);
    return 0;
}

  内联函数, 是C++新增的特性, 使用的比较少, 主要是代码优化有关系, 对于代码比较少, 而且调用次数比较多的函数, 可以定义为内联函数;

  内部原理是定义宏:

#include <iostream>
#include <string>
inline void show() {
    using namespace std;
    cout << "nice" << endl;
}
int main() {
    show();
    return 0;
}

  引用也是C++新增的特性, 务必区别于指针, 引用的地址和原来数据的地址是相同的, 引用必须在变量定义的时候就初始化:

#include <iostream>
int main() {
    int i = 1111;
    int &j = i;
    j = 2222;
    std::cout << i << std::endl;
    std::cout << &i << std::endl;
    std::cout << &j << std::endl;
    return 0;
}

  按照引用传递主要用在函数参数中, 在形参上定义引用, 那么在函数内部做的任何数据修改, 都会修改原始值:

#include <iostream>
void swap (int &a, int &b) {
    int temp;
    temp = a;
    a = b;
    b = temp;
}
int main() {
    using namespace std;
    int a = 1;
    int b = 2;
    swap( a, b );
    cout << a << endl; //输出2
    cout << b << endl; //输出1
    return 0;
}

  编译器会发出警告, 告诉开发者一些错误, 比如函数没有指定返回值, 但是这个并不会影响程序正常运行:

#include <iostream>
#include <cstring>
int run () {
    if(false){
        return 1;
    }else{

    }
}
int main() {
    run();
    printf("end of file");
    return 0;
}

  C++中原型的概念:原型描述了函数的接口, 它将函数的返回类型, 参数类型以及参数个数定义在文件头, 原型有利于程序执行效率的进行提高 , 相当于java中的接口文件, 只是包含接口, 没有具体的实现:

#include <iostream>
void run(); //原型的定义
#include <cstring>
int main() {
    run();
    return 0;
}
void run () {
    std::cout << "done" << std::endl;
}

  ??, 常量指针也有一些比较有意思的地方, 比如const声明的位置,const int *p = &num; int * const p1 = &num, 是完全不同的:

#include <iostream>
#include <cstring>
using namespace std;
int main() {
    int num = 100;
    const int *p = &num;
    int * const p1 = &num;
    std::cout << *p << std::endl;
    std::cout << *p1 << std::endl;
    return 0;
}

  const int * p 中, const修饰的是int, 所以只要p的指针指向的类型是数字, 都符合编译器的规范,也就是说, 我们可以改变p的地址;

  int * const p中, const修饰的是p, 所以p这个指针式不能变的, 但是通过*p, 我们可以改变原来数据的值;

#include <iostream>
#include <cstring>
using namespace std;
int main() {
    int num = 100;
    //常量指针
    const int *p = &num;
    //*p = 1; 是错误的, 指针不能变;
    int n = 101;
    //如果对指针重新赋值是可以的, 因为const是修饰int, 只要p指向的数据类型是int就可以;
    p = &n;
    std::cout << *p << std::endl;
    return 0;
}
#include <iostream>
#include <cstring>
using namespace std;
int main() {
    int num = 100;
    //常量指针
    int * const p = &num;
    *p = 101;
    std::cout << *p << std::endl;
    return 0;
}

  数组指针加1, 数组指针会自动往下移动一个位:

#include <iostream>
#include <cstring>
using namespace std;
int main() {
    int arr[3][2] = {{0,0},{1,1},{2,2}};
    printf("%p\n", arr[0]);
    printf("%p\n", arr[0]+1);
    printf("%p\n", arr+1);
    printf("%p\n", arr+2);
    return 0;
}

  C的字符串其实就是一堆字符组成的数组, 最后一位以 \0 结束, 所以创建字符串的方法还是比较多的:

#include <iostream>
#include <cstring>
using namespace std;
int main() {
    char str[] = "abcd";
    char str1[] = {‘a‘,‘b‘,‘c‘,‘d‘,‘e‘,‘\0‘};
    char *str2 = "abcdef";
    printf("%s\n",str);
    printf("%s\n",str1);
    printf("%s\n",str2);
    return 0;
}

  获取字符串的长度:

#include <iostream>
#include <cstring>
using namespace std;
int size(char *p) {
    int c = 0;
    while(*p) {
        c++;
        p++;
    };
    return c;
}
int main() {
    char str[] = "abcd";
    char str1[] = {‘a‘,‘b‘,‘c‘,‘d‘,‘e‘,‘\0‘};
    char *str2 = "abcdef";
    cout << size(str) << endl;
    cout << size(str1) << endl;
    cout << size(str2) << endl;
    return 0;
}

  函数默认参数:

#include <iostream>
#include <cstring>
using namespace std;
void defFn(int i, int j = 2) {
    cout << i + j << endl;
}
int main() {
    defFn(1,1);
    defFn(1);
    return 0;
}

  函数重载:

#include <iostream>
#include <cstring>
using namespace std;
void defFn(int i);
void defFn(double j);
int main() {
    defFn(1);
    defFn(1.1);
    return 0;
}
void defFn(int i) {
    cout << "int " << i << endl;
}
void defFn(double j) {
    cout << "double " << j << endl;
}

  泛型模版:

#include <iostream>
#include <cstring>
using namespace std;
template <typename T>
void show(T name);
int main() {
    show(1234);
    show(‘a‘);
    return 0;
}
template <typename T>
void show(T name) {
    cout << name << endl;
}

  其他:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
    printf("%d\n", atoi("510"));
    printf("%ld\n", atol("5101231231231"));
    char str[10] = {‘a‘,‘b‘,‘c‘,‘d‘,‘\n‘};
    fgets(str, sizeof(str), stdin);
    printf("%s%s\n", str, str);
    char name[10];
    scanf("%s", name);
    printf("%s", strcat(name,"hello"));
    int ren = rename("name1", "name");
    int ren1 = rename("name", "name1");
    int ren2 = rename("name2", "name3");
    printf("%d, %d, %d\n",ren, ren1, ren2);
    perror(str);
    return 0;
}

  EOF   

时间: 2024-08-07 04:56:02

C++代码复习笔记:第三章的相关文章

Linux内核设计与实现读书笔记——第三章

Linux内核设计与实现读书笔记——第三章 进程管理 20135111李光豫 3.1进程 1.进程即处于执行期的程序,并不局限于一个可执行的代码,是处于执行期程序以及其相关资源的总称. 2.Linux系统中,对于进程和线程并没有明显的区分,线程是一种特殊的进程. 3.Linux系统中,常用fork()进程创建子进程.调用fork()进程的成之为其子进程的父进程. 4.fork()继承实际上由clone()系统调用实现.最后通过exit()退出执行. 3.2任务描述符及任务结构 1.任务队列实质上

人月神话阅读笔记—第三章

人月神话阅读笔记-第三章 一个由一流人才组成的小型的精干的队伍比由一群平庸的程序员组成的大型团队更有效率,但是这里面有一个重要的问题:如何在有意义的进度安排内创建大型的系统. 优秀的程序员和较差的程序员之间生产效率的差距是巨大的,当一个10人的精干团队进行开发,和一个100个人的平庸程序员进行开发,前者的效率更高.但是对于效率和概念的完成性来说,最好由少数干练人员开发,而大型系统需要大量人员进行开发,但是这两者是有矛盾的,需要进行平衡. 在开发过程中,可以使用一种崭新的开发方案,类似于外科医生做

Android群英传神兵利器读书笔记——第三章:Android Studio奇技淫巧

Android群英传神兵利器读书笔记--第三章:Android Studio奇技淫巧 这篇文章篇幅较长,可以使用版权声明下面的目录,找到感兴趣的进行阅读 目录 3.1 Android Studio使用初探 Project面板 Stucture面板 Android Monitor Keymap Tip of the Day 快速查找 Search Action 演示模式 3.2 Android Studio使用进阶 操作与导航 快速重构 代码模板 内置模板 自定义代码注释模板 代码分析 在Andr

2014年软考程序员-常考知识点复习笔记【第二章】

51CTO学院,在软考备考季特别整理了"2014年软考程序员-常考知识点复习笔记[汇总篇]",帮助各位学院顺利过关!更多软件水平考试辅导及试题,请关注51CTO学院-软考分类吧! 查看汇总:2014年软考程序员-常考知识点复习笔记[汇总篇]  二叉树三种遍历的非递归算法(背诵版) 1.先序遍历非递归算法 #define maxsize 100 typedef struct { Bitree Elem[maxsize]; int top; }SqStack; void PreOrderU

C++PRIMER 阅读笔记 第三章

本章主要介绍 string vector 和 bitset, 不能贪多,现在本文主要介绍 string 与 vector 头文件中最好不要使用namespace std, 因为头文件会直接被预处理器放置到C中 std::string 的构造方式: string s1; string s2(s1); string s3("value");string s4(n,'c');           第三种构造方式可有"\0"? cout 与 cin 可以直接操作string

MySQL Cookbook读书笔记第三章

1,查询指定列/从指定列中查询 若需要指定每一列在查询结果中出现的先后顺序,可以在select语句中指定(dstuser在dsthost之后): 查询显示用户所关注的列: 2,指定查询行 使用where关键字可以查询符合条件限制的数据例如:查找srchost为venus或者srchost以s开头的行记录: 使用操作符like进行模式匹配,其中%表示通配符,代表一个差多为任意值的字符串. where使用操作符and可以查询多个条件: 条件并集: 3,格式化显示查询结果 当查询语句中没有重命名列名,

Shell学习笔记——第三章

第三章 /etc/passwd 文件包含一个所有系统用户账户组成的列表,以及一些关于每个用户的基本信息. 例rich:x:501:Rich Blum:/home/rich:/bin/bash 每个条目都有7个数据字段,例使用冒号分隔.系统使用这些字段中的数据向用户分配具体的特性.这些字段分别有 用户名:用户密码(如果密码存储在其他文件中,则为占位符):用户的系统用户ID编号:用户的系统组的ID编号:用户的全名:用户默认的主目录:用户的默认Shell目录: cd 命令 略过 列表命令(ls) 参数

effective java-读书笔记-第三章 对于所有对象都通用的方法

个人博客同步发布:effective java-读书笔记-第三章 对于所有对象都通用的方法 第三章 对于所有对象都通用的方法 所有非final方法(equals.hashCode.toString.clone.finalize)都有明确的通用约定,因为它们被设计成是要被覆盖的,如果不遵守,基于散列的集合(HashMap.HashSet.HashTable)可能无法结合该类一起运作. 第8条 覆盖equals时请遵守通用约定 覆盖equals规范: 自反性(reflexive).对于任何非null

《Linux Shell脚本攻略》 笔记 第三章:文件操作

<Linux Shell脚本攻略> 笔记 第三章:文件操作 1.生产任意大小的文件 [[email protected] dd_test]# [[email protected] dd_test]# dd if=/dev/zero of=junk.data bs=1k count=10 10+0 records in 10+0 records out 10240 bytes (10 kB) copied, 0.00137023 s, 7.5 MB/s 2.文件系统相关测试 [ -f $file

C++ Primer 笔记 第三章

C++ Primer 第三章 标准库类型 3.1using声明 例: using namespace atd; using std::cin; 3.2string类型 初始化方式 string s1 默认构造函数,s1为空串 string s2(s1) 将s2初始化为s1的一个副本 string s3(“value”) 将s3初始化为一个字符串的副本 string s4(n, 'c') 将s4初始化为字符'c'的n个副本 getline读取整行文本 getline接受两个参数:一个是输入流对象和