OI中的C++语法基础&进阶技巧

前言: 写这个的目的主要是为了总结在OI中用到的C++语法奇淫巧技以及在入门的时候没学好的C/C++语言语法部分


数据类型

OI中常用的数据类型大小

数据类型范围位数
int-2147483648~214748364710
unsigned int0~429496729510
long long-9223372036854775808~92233,72036,85477,580719
unsigned long long0~1844674407370955161520

总之,9位数能安全地用int存下,18位数用long long,19位数或是 2 64 2^{64} 264以内用unsigned long long.

另外,合理利用unsigned类型的自动溢出机制可以实现取模运算中的骚操作–快速乘.

输入输出相关(printf,cout)

关于printf菜鸟教程已经讲得很详细了,下面给出几个实例:

#include <bits/stdc++.h>

using namespace std;

int main()
{
	printf("%-6d
",3);
	printf("%+06d
",3);
	printf("%010.2f
",32434.434);
	unsigned long long a=1;
	for(int i=1;i<=64;i++) a*=2; a--;
	printf("%llu",a);
	
	return 0;
}

输出:

3
+00003
0032434.43
18446744073709551615

结构体(struct)

结构体以前比较常用的是带结构体排序,就不再提及.高阶技巧便是把结构体当作一个简单版class用,可以封装一些函数,结构体中的运算符重载也能节约不少时间.

初始化

struct test
{
	int a,b,c;
	test(int p,int q)
	{
		a=p,b=q;
	}
	test(char s)
	{
		c=s-'A';
	}
};

int main()
{
	test a=test(3,5);
	test b(3,5);
	test c('A');
	cout<<a.a<<' '<<b.b<<' '<<c.c;
	
	return 0;
}

输出:

3 5 0

简单来讲就是让新建一个结构体变量的操作变方便了

运算符重载

别看代码短,其实有很多东西

struct test
{
	int a,b,c;
	test(int p,int q)
	{
		a=p,b=q;
	}
	/*
	下面这个函数的返回值为bool,重载的运算符为<,运算符左边的数据类型为test,右边
	的数据类型也为test
	括号内const和&的用途在于加速和不改变源值
	第二个const放在非静态成员函数的尾部,表示该非静态成员函数不修改对象内容
	*/
	bool operator < (const test &m) const
	{
		if(a<m.a) return false;
		else return true;
	}
	bool operator > (const test &m) const
	{
		if(b>m.b) return true;
		else return false;
	}
	int operator + (const test &m) const 
	{
		return a+b+m.a+m.b;
	}
	test operator - (const test &m) const
	{
		test q(a-m.a,b-m.b);
		return q;
	}
};

int main()
{
	test a=test(3,5);
	test b(2,6);
	test c(3,7);
	cout<<(a<b)<<' '<<(a>b)<<' '<<(a+b)<<' '<<(b-c+a);
	
	return 0;
}

输出:

1 0 16 6

面向对象编程

参看菜鸟教程

原文地址:https://www.cnblogs.com/huaruoji/p/14425573.html