首页 > 编程语言 >你真的懂C++吗?

你真的懂C++吗?

时间:2024-10-12 16:25:34浏览次数:6  
标签:std myVector const cout int C++ return 真的

看看下面的代码,你真的懂C++吗?

#define N 2
#define M N + 1
#define NUM (M + 1) * M / 2
int main(){
    std::cout << NUM;
    return 0;
}
// 输出结果为 8, 展开过程如下
// (M + 1) * M / 2
// (N + 1 + 1) * N + 1 / 2
// (2 + 1 + 1) * 2 + 1 / 2
//  4 * 2 + 0
//  8

cout << sizeof(i++) << endl; //代码执行之后,i并没有加1

#include <algorithm>
#include <iostream>
using namespace std;
class Animal {
  public:
    virtual void eat() const {
        cout << "Animal eats" << endl;
    }
    virtual ~Animal(){}
};

class Dog : public Animal {
  public:
    virtual void eat() {
        cout << "Dog eats" << endl;
    }
    virtual ~Dog(){}
};

int main() {
    Animal *animal = new Dog();
    Dog *dog = new Dog();
    animal->eat();
    dog->eat();
    delete animal;
    delete dog;
    return 0;
}
/*
上面的代码输出为:
Animal eats
Dog eats
如果把第一个Animal类的const去掉,就会输出
Dog eats
Dog eats
这是因为C++多态规定,基类和派生类中同名虚函数的函数名、返回值类型、函数参数个数及参数类型等必须完全相同。
如果基类的虚函数后面没有加const,派生类同名的函数后面加了const,那么派生类的函数没有起到虚函数的作用。
*/

int number = 1;
auto func1 = [=]() { return number; };
auto func2 = [&]() { return number; };
number++;
std::cout << func1() << ' ' << func2();  //输出 1 2

#include <iostream>
using namespace std;

double Up(double x) { return 2.0 * x; }
void R1(const double &rx) { cout << "const double & rx" << endl; }
void R1(double &&rx) { cout << "double && rx" << endl; }

int main()
{
    double w = 10.0;
    R1(w + 1);  // 输出 double && rx
    R1(Up(w));  // 输出 double && rx
    return 0;
}

auto myTuple = make_tuple<int,int,bool,char>(1,2,true,'C');
auto otherTuple = make_tuple<int,int,bool,char>(1,3, true, 'C' );
cout << sizeof(myTuple) << endl;  //输出 12, 不同机器结果不同
cout << tuple_size<decltype(myTuple)>::value << endl;  //输出元素数量 4

#include <iostream>

void Foo(const int &) {std::cout << "const l-ref" << std::endl;}
void Foo(int &) {std::cout << "l-ref" << std::endl;}
void Foo(int &&) {std::cout << "r-ref" << std::endl;}

template <typename ...Args> 
void ForwardRef(Args&& ...args) {
    Foo(std::forward<Args>(args)...);
}
int main(){
    ForwardRef(1); //输出r-ref
    int x = 1; ForwardRef(x); //输出l-ref
    int& y = x; ForwardRef(y); //输出l-ref
    const int& z = x; ForwardRef(z); //输出const l-ref
    return 0;
}

int a = 5;
static int b = 3;
auto funca = [=]() mutable {
    ++a; return a;
};
auto funcb = [=]() mutable {
    ++b; return b;
};
cout << funca() << " " << funcb() << endl; // 输出 6 4
cout << funca() << " " << funcb() << endl; // 输出 7 5
cout << a << " " << b << endl;             // 输出 5 5

enum Status {GOOD = -1, BAD, UNKNOWN};
cout << UNKNOWN << endl; //输出1
cout << static_cast<Status>(static_cast<int>(UNKNOWN) - 1) << endl;

#include <iostream>
using namespace std;
class Base {
  public:
    Base(int a) : varA(a) {}
    int varA;
};
class Derived : public Base {
  public:
    int varB;
    int varC;
    Derived(int a, int c) : varC(c), Base(a), varB(varA + varC) {}
};

Derived derived(1, 10); // 全局变量

int main() {
    cout << derived.varA << " " << derived.varB << " " << derived.varC << " " << endl;
    // 输出 1 1 10
    // 按照声明的顺序初始化而不是列表的顺序,这里初始化顺序是 varA,varB,varC,由于varB要被赋值为varA + varC时,
    // varC还没有赋值,所以此时varC = 0,varB被赋值为varA=1
    // 但是,把 Derived derived(1, 10) 放到int main()里面,情况又会不一样,这个我也解释不了。
    return 0;
}


#include <iostream>
class BaseException {};
class DerivedException:public BaseException {};
int main() {
    try {
        BaseException* except = new DerivedException();
        throw *except;
    } catch (DerivedException&) {
        std::cout << "DerivedException";
    } catch (BaseException&) {
        std::cout << "BaseException";
    } catch (...) {
        std::cout << "other Exception";
    }
    // 输出 BaseException
}

假设有以下代码:

class MyData {
public:
	MyData() : value(5) {}
private:
	int value;
};

void Func()
{
std::vector<MyData> myVector;
// ……对myVector进行了一些操作
____ // 想要添加一个元素到myVector中
}

横线处的代码想要添加一个MyData对象到myVector容器中,并且要求添加的这个MyData对象中value成员的值是5。下面代码可以正确完成这个动作:

myVector.push_back(MyData());
myVector.insert(myVector.end(), MyData());
myVector.resize(myVector.size() + 1);
//但是当myVector为空时,*(myVector.end()) = MyData(); 会报错

const int a = 128;
//以下都是无法通过的代码:
int * const b = &a;
int *b = &a;
int &b = a;
//以下是可以通过的代码:
const int &b = a;
const int *b = a;
int const *b = a;

//拷贝构造、移动构造、拷贝赋值、移动赋值你会写吗?
class A {
public:
    A() {
        cout << "Default constructor" << endl;
    }
    A(const A& a) {
        cout << "Copy constructor" << endl;
    }
    A(A&& a) {
        cout << "Move constructor" << endl;
    }
    A& operator=(const A& p) {
        cout << "Copy assign" << endl;
    }
    A& operator=(A&& other) {
        cout << "Move assign" << endl;
    }
};

标签:std,myVector,const,cout,int,C++,return,真的
From: https://www.cnblogs.com/mariocanfly/p/18460766

相关文章

  • 实验1 现代C++编程初体验
    task1://现代C++标准库、算法库体验//本例用到以下内容://1.字符串string,动态数组容器类vector、迭代器//2.算法库:反转元素次序、旋转元素//3.函数模板、const引用作为形参#include<iostream>#include<string>#include<vector>#include<algorithm>usin......
  • C++ 中 `const` 的用法
    C++中const的用法1.在成员函数中的const示例:voidprintWindow()const{//...}含义和特性:函数不会修改对象状态:声明为const的成员函数承诺不会修改该类的任何非const成员变量。可以被常量对象调用:const成员函数可以被常量对象调用,确......
  • 【日记】强烈地意识到了:她对我而言,真的很重要
    写在前面2164字|情感内容|亲密关系|HSP|暴言注意正文最安静的一集。今天所有客户经理都出差去了。一楼只有我、柜面主管、前台和门卫四个人。两个小时没人说一句话。社恐天堂。工作上没什么好说的。中午明明人很少,但是食堂阿姨做了很多菜,就很奇......
  • 关于C++当中全局变量的释放问题
    一、由来主要是在修改公司的一个MFC项目的时候遇到的问题,我在MFC页面的析构函数当中对一个全局图像变量进行了释放,具体如下:ai_engine_OCR::~ai_engine_OCR(){//及时释放内存if(g_pImg_open!=NULL){deleteg_pImg_open;g_pImg_open=NULL......
  • c++设置windons默认输出音频设备
    c++设置windons默认输出音频设备主要功能是控制默认输出的音频设备进行切换。本文主要教导如何使用c++进行控制代码示例#include<windows.h>#include<mmdeviceapi.h>#include<iostream>#include<functiondiscoverykeys_devpkey.h>#include<vector>#include"......
  • C++指针的基本使用
    目录一、定义和使用二、指针占用的空间三、空指针和野指针1、空指针2、野指针四、const修饰指针五、指针和数组六、指针和函数七、结构体指针一、定义和使用指针变量定义语法:数据类型*变量名;intmain(){ //1、指针的定义 inta=10;//定义整型变量a ......
  • 南沙C++信奥赛陈老师解一本通题 1939:【07NOIP普及组】纪念品分组
    ​ 【题目描述】元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作。为使得参加晚会的同学所获得的纪念品价值相对均衡,他要把购来的纪念品根据价格进行分组,但每组最多只能包括两件纪念品,并且每组纪念品的价格之和不能超过一个给定的整数。为了保证在尽量短的时间内发完......
  • 蓝桥杯真题 穿越时空之门(第十五届蓝桥杯省赛PythonB组A题) c++题解
    问题如下(附链接):穿越时空之门题解代码如下:#include<iostream>usingnamespacestd;intx1(inti){inta=0;while(i){a+=i%2;i/=2;}returna;}intx2(inti){intb=0;while(i){b+=i%4;i/=4;}returnb;}intmain()......
  • C++ 类(1)
    1.什么是类在C语言中,我们学过结构体,我们可以在结构体里面定义变量在C++中,我们还可以在结构体里面定义函数structAdd{inta;charb;doublec;int&cal(inta,intb){a=a+b;returna;}};intmain(void)......
  • 实验1 现代C++编程初体验
    实验1:task.cpp1#include<iostream>2#include<string>3#include<vector>4#include<algorithm>5usingnamespacestd;67template<typenameT>8voidoutput(constT&c);910voidtest1();11voidtest2();......