c++基础

1. 二级指针

int main() {

    int (*p)[3];
    int arr[2][3] = {{3,2,1},{4,5,6}};

//    int arr[3] = {1,2,3};
//    for (int i = 0; i < 3; ++i) {
//        p[i] = arr;
//    }

    p = arr;
//    int arr2[] = {4,5,6};
//    p[1] = arr2;

    printf("%d",**p);
    printf("%d",*(*p+1));
    printf("%d",*(*p+2));

    printf("%d",*(*(p+1)+1));
    printf("%d",*(p[1]+2));


    for (int i = 0; i < 2; ++i) {
        printf("\nindex %d\n",i);
        for (int j = 0; j < 3; ++j) {
//            printf("arr %d  ",*(*(p+i)+j));
            printf("arr %d  ",(*(p+i))[j]);
        }
    }


    return 0;
}

2.结构体

//结构体使用 People与Student区别  People是一个全局变量 Student是一个结构体类型
struct _People{
    char* name;
    int age;
}People;

typedef _People ZZ;

typedef struct _Student{
    char* name;
    int age;
}Student;

int main() {

//    ZZ a;
//    struct _People a{"zz",12};
//    a.age = 25;
//    a.name = "dabaicai";
//    printf("a name is %s age is %d",a.name,a.age);

//    People.name = "dabaicai";
//    People.age = 25;
//    printf("People name is %s age is %d",People.name,People.age);

//    struct _Student ss{"aa",12};
    Student ss;
    ss.name = "dabaicai";
    ss.age = 25;
    printf("ss name is %s age is %d",ss.name,ss.age);

    return 0;
}

3.类

-----------------------------------h----------------------------------------------
#ifndef UNTITLED_STUDENT_H
#define UNTITLED_STUDENT_H


class Student {
private:
    static Student *instance;
    Student();

    int age;
public:
    char *name;

    Student(int age);

    static Student *getInstance();

    void friend setAge(Student *student);

    Student operator+(const Student &student) {
        Student temp;
        temp.age = this->age + student.age;
        return temp;
    };

    int getAge(){
        return age;
    }
};


#endif //UNTITLED_STUDENT_H


-----------------------------------cpp----------------------------------------------



Student* Student::instance = 0;
Student*Student::getInstance() {
    if(!instance){
        instance = new Student();
    }
    return instance;
}

Student::Student() {

}

Student::Student(int age) {
    this->age = age;
}


-----------------------------------main---------------------------------------------


#include <iostream>
#include "Student.h"

//友元函数
void setAge(Student * student){
    student->age = 25;
}

int main() {


    Student* student = Student::getInstance();
    setAge(student);


    Student* student2 = new Student(50);
    Student student1 = *student + *student2;
    printf("student age is %d",student1.getAge());
    return 0;
}

4.模板

#include <iostream>


template<class T, class E>
class Q {
public:
    T test(T t, E e) {
        return t + e;
    }
};

template<class T>
T zz(T a, T b) {
    return a + b;
}


int main() {

    Q<int, float> q;
    std::cout << q.test(1, 1.5f) << std::endl;

    std::cout << zz(1, 4);

    return 0;
}

5.命名空间

可以区分二个同名函数

#include <iostream>


template<class T, class E>
class Q {
public:
    T test(T t, E e) {
        return t + e;
    }
};

int add(int a, int b) {
    return a + b;
}

float add(float a, float b) {
    return a + b;
}

template<class T>
T zz(T a, T b) {
    return a + b;
}


namespace first_space{
    void func(){
        printf("first space func");
    }
}

namespace second_space{
    void func(){
        printf("second space func");
    }
}


int main() {

    first_space::func();
    second_space::func();

    int i = 1;
    int&b = i;
    int c = i;
    printf("\ni is %d,&b is %d,c is %d",&i,&b,&c);
    //i is -274684040,&b is -274684040,c is -274684052

    return 0;
}

6.gcc编译四步骤

1.预处理( Pre-Processing ):将要包含(include)的文件插入原文件中、将宏定义展开、根据条件编译命令选择要使用的代码
gcc -E -o add.i add.c
2.编译( Compiling ):检查代码规范,错误等后将代码翻译成汇编代码
gcc -S -o add.s add.i
3.汇编( Assembling ):生成目标文件.o文件,将汇编代码生成目标(机器)代码
gcc -c add.cpp -o add.o (最耗时)
4.链接( Linking ):将汇编生成的OBJ文件、系统库的OBJ文件、库文件链接起来,最终生成可以在特定平台运行的可执行程(文件)
gcc add.o -o add (生成可执行文件add)

7.生成静态库

ar 将目标文件打包成静态库
ar t xxx.a 查看静态库内容

//add.h
int add(int a,int b);

//add.c
#include "add.h"

int add(int a,int b){
    return a+b;
}

//main.c
#include<stdio.h>
#include "add.h"

int main(){
    int a = add(1,2);
    printf("a = %d",a);
    return 0;
}

1. gcc -c add.c //将 add.c 编译成 add.o
2. ar rcs libadd.a add.o //将 add.o 生成静态库文件
3. gcc -o main main.c -L. -ladd // 将 main.c 编译并链接 libadd.a 库文件

---------------------------------------------
执行 ./main 
输出 a = 3

8.生成动态库

1. gcc -c add.c //将 add.c 编译成 add.o
2.gcc -shared -fPIC -o libadd.so add.o //生成动态库
3.gcc -o main main.c -L. -ladd // 将 main.c 编译并链接 libadd.so 库文件

---------------------------------------------
linux下执行 LD_LIBRARY_PATH=. ./main 
mac下执行 ./main
输出 a = 3

---------------------------------------------
linux 执行 ldd main
    linux-vdso.so.1 =>  (0x00007ffe8aeb9000)
    libtool.so => not found
    libc.so.6 => /lib64/libc.so.6 (0x00007f2c0c74b000)
    /lib64/ld-linux-x86-64.so.2 (0x0000555dd56da000)

注意:在linux上直接执行 ./main 会报 ./main: error while loading shared libraries: libtool.so: cannot open shared object file: No such file or directory 这个错误 ,原因是生成的动态库在默认查找的动态库目录下没有(可以用 ldd main 查看查找动态库目录),所以要设置查找目录。
而在 mac 下直接执行不会报,目前不清楚。。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,723评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,003评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,512评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,825评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,874评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,841评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,812评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,582评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,033评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,309评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,450评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,158评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,789评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,409评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,609评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,440评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,357评论 2 352

推荐阅读更多精彩内容

  • 之前我写过一系列的c/c++ 从汇编上解释它如何实现的博文。从汇编层面上看,确实c/c++的执行过程很清晰,甚至有...
    一叶障目阅读 223评论 0 0
  • C++基础2:类与对象 1. 认识类与对象 什么是类(class)?类(class)是类型(type),是用户自定...
    jdzhangxin阅读 2,254评论 0 7
  • 1.请说出static和const关键字尽可能多的作用 static关键字至少有下列n个作用:(1)函数体内sta...
    某WAP阅读 487评论 0 0
  • 面试中的C++常见问题 1.在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern “C”? 答:首...
    程序爱好者阅读 440评论 0 0
  • 多态 多态性是面向对象程序设计的一个重要特征,能增加程序的灵活性。可以减轻 系统 升级,维护,调试的工作量和复杂度...
    青春猪头少年_阅读 228评论 0 0