/**
cwl:
内容:c++非面向对象的一些杂项总结
1, c++转换函数
*/
#include <bits/stdc++.h>
using namespace std;
class Fraction
{
public:
Fraction(int num, int den = 1)
:m_numberator(num), m_denominator(den) {}
operator double() const {
return (double)((m_numberator * 1.0) / m_denominator);
}
Fraction operator + (const Fraction &f) {
///...
return Fraction(0);
}
private:
int m_numberator; ///分子
int m_denominator; ///分母
};
template<typename T>
void show(const T& firstArg)
{
cout << firstArg << endl;
}
template<typename T, typename... Types>
void show(const T& firstArg, const Types&... args)
{
cout << firstArg << endl;
show(args...);
}
class A
{
public:
void show() { cout << "A" << endl; }
};
class B: public A
{
public:
void show() { cout << "B" << endl; }
};
int main()
{
///【1】转换函数
Fraction a = 3;
printf("%f
", (double)a);
/**
operator double() const {
return (double)((m_numberator * 1.0) / m_denominator);
}
*/
///【2】
/**
explicit Fraction(int num, int den = 1)
:m_numberator(num), m_denominator(den) {}
explicit避免构造函数在这个部分隐式转换
*/
///【3】智能指针,一个像指针的类
/**
【第一类智能指针】
template<class T>
class Shared_ptr
{
public:
T& operator*() const
{ return *px; }
T& operator->() const
{ return px; }
Shared_ptr(T* p):px(p) {}
private:
T* px;
long *pn;
};
//注意这里为了清晰度没有写delete部分
// Shared_ptr<int>p = new int;
// *p = 1;
【第二类迭代器】
对指针重载++ --
*/
/**
【4】仿函数
设计一个类,行为像函数,重载()即可
class Test {
void operator () () {
///...
}
}
*/
/**
【5】
模板可变参数
template<typename T>
void show(const T& firstArg)
{
cout << firstArg << endl;
}
template<typename T, typename... Types>
void show(const T& firstArg, const Types&... args)
{
cout << firstArg << endl;
show(args...);
}
*/
///show(1, 3, 4, 5);
/**
因为泛型的原因c++11重写定义了auto。动态绑定类型
另一中拆包方式
// 编译这个代码需要开启 -std=c++14
// 因为版本原因,实验环境中的 g++ 尚不支持此特性,此处可以使用 clang++ 替代 g++
template<typename T, typename... Args>
auto print(T value, Args... args) {
std::cout << value << std::endl;
return std::initializer_list<T>{([&] {
std::cout << args << std::endl;
}(), value)...};
}
int main() {
print(1, 2.1, "123");
return 0;
}
*/
///【5】子类调用父类函数
B class_b;
class_b.A::show(); ///子类中调用父类方法
return 0;
}