`

c/c++中需要注意的小知识点

阅读更多
1. 函数的参数传递方式
  • 按值传递(跟Java一样。因为Java中没有指针)
  • 按引用传递

在实例中,交换函数最能体现函数的参数传递方式。
#include<iostream>

using namespace std;

void swap(char *a, char *b);
void swap1(char **a, char **b);
void swap2(char* &a, char* &b);

int main()
{
	char *a = "first", *b = "second";
	cout << a << " " << b << endl;
	
	swap(a,b);
	cout << a << " " << b << endl;
	
	swap1(&a,&b);
	cout << a << " " << b << endl;
	
	swap2(a,b);
	cout << a << " " << b << endl;

	return 0;
}

void swap(char *a, char *b)
{
	char *temp = a;
	a = b;
	b = temp;
}

void swap1(char **a, char **b)
{
	char *temp = *a;
	*a = *b;
	*b = temp;
}

void swap2(char* &a, char* &b)
{
	char* temp = a;
	a = b;
	b = temp;
}



结果:
a=first,b=second
a=first,b=second
a=second,b=first
x=1,y=2
x=2,y=1

2.在C++中的多个结果输出的顺序
按照从右向左计算,从左向右输出。
#include<iostream>

using namespace std;

int main(){
	int n = 10;	
	cout << n << "," << n++ << endl;
}

结果: 11,10
3。 C++中的变量作用域
同一变量名,由于他们的作用域不同,表示的对象也不同。全局变量进入局部变量的作用域时,全局变量是不可见的,因而不能引用。不过可以使用作用域区分符"::"来访问。指示所要引用的变量是全局变量。
#include<iostream>

using namespace std;
int a = 10;
int main(){
	int a = 20;
	cout << "a=\t" << a << endl;
	cout << "::a=\t" << ::a << endl;
}

结果:
a=      20
::a=    10

4。函数变量的缺省值
#include<iostream>

using namespace std;

int sum(int a=1, int b=1);
int sum1(int , int =22);
int main(){
	int a=10,b=20;
	cout << "sum=" << sum() << endl;
	cout << "sum=" << sum(a) << endl;
	cout << "sum=" << sum(a,b) << endl;

	cout << "sum1" << sum1(a) << endl;
}

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

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


结果:
sum=2
sum=11
sum=30
sum1=32

5。运算符重载
运算符重载相当于写一个重载的函数,这样理解的话,写起来会方便很多。运算符重载分为成员函数和友元函数重载运算符。
(1) 成员函数
#include<iostream>

using namespace std;

class Num{
	private:
		int num;
	public:
		Num(int num = 0){this->num = num;}
		int getNum(){return this->num;}
		void setNum(int num){this->num = num;}
		void printNum(){cout << this->num << endl;}
		Num operator+(Num num_obj);
};

Num Num::operator+(Num num_obj){
	Num temp;
	int result = this->getNum() + num_obj.getNum();
	temp.setNum(result);
	return temp;
}

int main(){
	Num num1(1),num2(2),num3;
	num3 = num1 + num2;
	num3.printNum();
}

结果是:3
(2) 友元函数
#include<iostream>

using namespace std;

class Num{
	private:
		int num;
	public:
		Num(int num = 0){this->num = num;}
		int getNum(){return this->num;}
		void setNum(int num){this->num = num;}
		void printNum(){cout << this->num << endl;}
		friend Num operator+(int num, Num num_obj);
};

Num operator+(int num, Num num_obj){
	Num temp;
	int result = num + num_obj.getNum();
	temp.setNum(result);
	return temp;
}

int main(){
	Num num1(1),num3;
	int _num = 2;
	num3 = 2 + num1;
	num3.printNum();
}

结果:3

6. C++中的多重继承
跟Java不同,C++支持多重继承,这也给C++带来了需要解决的问题--二义性。因此出现了virtual关键字,出现了虚基类来消除二义性。

(1) 问题
#include<iostream>

using namespace std;

class Base{
	public:
		void print(){cout << "in Base class" << endl;}
};

class Base1 : public Base{};
class Base2 : public Base{};

class Base3 : public Base1, public Base2{};

int main(){
	Base3 base3;
	base3.print();
}

编译结果:
[root@NetFPGA11 c]# g++ virtual.cc -o virtual
virtual.cc: In function ‘int main()’:
virtual.cc:17: error: request for member ‘print’ is ambiguous
virtual.cc:7: error: candidates are: void Base::print()
virtual.cc:7: error:                 void Base::print()
(2)改成如下的虚基类,便解决了二义性问题。
#include<iostream>

using namespace std;

class Base{
	public:
		void print(){cout << "in Base class" << endl;}
};

class Base1 : virtual public Base{};
class Base2 : virtual public Base{};

class Base3 : public Base1, public Base2{};

int main(){
	Base3 base3;
	base3.print();
}

结果:in Base class

7.C++中的多态性
在C++中,多态性是由虚函数或者纯虚函数(包含纯虚函数的类叫做抽象类)来实现的。不同于Java本身就是多态的。多态性的表现形式为父类可以指向子类,这样如果不同的子类对父类同一方法进行了重写,那么会调用相应子类的方法。

8. C++中的友元函数或者友元类
(])友元函数。
#include<iostream>

using namespace std;

class A{
	private:
		int a;
	public:
		void setA(int x){a = x;}
		int getA(){return a;}
		friend void square(A &a_obj);//声明友元函数
};

void square(A &a_obj){//定义时不需要使用A::来指出属于哪个类,因为友元函数不属于任何一个类,不是类的成员函数
	cout << "square of " << a_obj.a << " is " << a_obj.a * a_obj.a << endl;
}

int main(){
	A a_obj;
	a_obj.setA(10);
	square(a_obj);
	cout << "A.a=" << a_obj.getA() << endl;
}

结果:
square of 10 is 100
A.a=10

(])友元成员函数。
#include<iostream>

using namespace std;

class x2;
class x1{
	private:
		char flag;
	public:
		void setFlag(char _flag){flag = _flag;}
		void printX2(x2 x);
};

class x2{
	private:
		char flag;
	public:
		void setFlag(char _flag){flag = _flag;}
		friend void x1::printX2(x2 x);
};

void x1::printX2(x2 x){
	cout << "x2 flag is " <<  x.flag << endl;
}

int main(){
	x1 _x1;
	_x1.setFlag('1');
	x2 _x2;
	_x2.setFlag('2');
	_x1.printX2(_x2);
}

结果:
x2 flag is 2
(3)友元类。
#include<iostream>

using namespace std;

class x1{
	friend class x2;// x2成为了x1的友元类,这样x2便可以访问x1的私有成员变量
	private:
		char flag;
	public:
		void setFlag(char _flag){flag = _flag;}
		void printFlag(){cout << "x1 flag is " << flag << endl;};
};

class x2{
	private:
		char flag;
	public:
		void setFlag(char _flag){flag = _flag;}
		void printFlag(){cout << "x2 flag is " << flag << endl;}
		void printFlag_x1(x1 _x1){cout << "x1 flag is " << _x1.flag << endl;}
};

int main(){
	x1 _x1;
	_x1.setFlag('1');
	x2 _x2;
	_x2.setFlag('2');

	_x2.printFlag();
	_x2.printFlag_x1(_x1);
}

结果:
x2 flag is 2
x1 flag is 1

9.C/C++中的原始数据类型
#include<stdio.h>

int main(){
	printf("char \tsize is: %d\n",sizeof(char));
	printf("short \tsize is: %d\n",sizeof(short));
	printf("int \tsize is: %d\n",sizeof(int));
	printf("long \tsize is: %d\n",sizeof(long));
	printf("float \tsize is: %d\n",sizeof(float));
	printf("double \tsize is: %d\n",sizeof(double));
}



结果:
char    size is: 1
short   size is: 2
int     size is: 4
long    size is: 4
float   size is: 4
double  size is: 8


10. C中的格式化输入输出
在其中经常遇到的标志符有:
dfecsox
十进制整数十进制浮点数指数形式的浮点数字符字符串十六进制这个念书八进制整数

在%和标志符之间可以使用数字来规范化输入输出:如
%9.2f //长度为9,小数位数为2的浮点数输出,其中小数点一位,整数位6位。如果不够的话,会以空格补齐使得右对齐(默认的对齐方式),如果实际的位数超过了输出的要求,那么会保留原来的数据内容。若想在左边补齐的方式是以0来填充,若要改变默认的对齐方式,可以用"-"来实现。但对于字符串来说,标志符前面的数字代表不同的意思。则在最前面补0。如下:
#include<stdio.h>

int main(){
	float f = 3.12;
	printf("%6.1f",f);//宽度为6,包括整数、小数点和小数在内共有3位,故左边会有3个空格补齐位
	printf("%4.1f\n",f);//宽度为4,左边有1个空格补齐位

	printf("%-6.1f",f);//左对齐
	printf("%-4.1f\n",f);

	printf("%2.1f",f);//宽度为2,而数据输出为3位,故保留了原来的数据,数据宽度成为了3。
	printf("%3.1f\n",f);

	printf("%06.1f",f);//用0补齐
	printf("%04.1f\n",f);

	char *s = "Hello World";
	printf("%6.9s\n",s);//输出的字符串长度为6到9位
	printf("%15.20s\n",s);
}


结果:
   3.1 3.1
3.1   3.1
3.13.1
0003.103.1
Hello Wor
    Hello World


#include <iostream>

using namespace std;

int main()
{
	//const 和 int 是可以交换位置,比如 const int* 和 int const* 是一样的,但不能和int*交换,也就是和int* const 不一样。 只要const能交换到最开始,这说明这个是内容不可变,否则是地址不可变

	int one = 1, two = 2, three = 3;
	const int* pOne = &one;// 指针指向地址的内容不可改变
	int* const pTwo = &two;// 指针指向的地址不可改变

	cout << *pOne << " " << *pTwo << endl;

// 	//*pOne = three;// error
// 	pOne = &three;
// 	cout << *pOne << " " << *pTwo << endl;


	//pTwo = &three; //error
	*pTwo = three;
	cout << *pOne << " " << *pTwo << endl;

	return 0;
}




11.四种生命周期的对象:
1) 全局对象,程序一开始,其构造函数就先被执行(比程序进入点更早),程序即将结束前其析构函数被调用
2) 局部对象,当对象诞生时其构造函数被执行,当程序流程将离开该对象的存活范围的时候其析构函数被调用
3) 静态对象当对象诞生时其构造函数被执行,当程序即将结束时其析构函数被调用,但比全局对象要早调用析构函数
4) 以new 方式产生的局部对象对象诞生时其构造函数被执行,当对象被delete掉的时候 析构函数被调用


12.面向对象语言的三个特点:
封装、继承、多态(c++中虚函数是来实现多态的关键)
分享到:
评论

相关推荐

    C/C++头文件包含

    本文将从多方面阐述C/C++头文件包含的知识点,帮助开发者更好地理解和使用C/C++语言。 C/C++语言关系 C++虽然是以C语言为基础发展起来的一门新语言,但她不是C语言的替代品,而是兄弟关系。C和C++各自有独立的标准...

    c/c++完整视频教程(三)——–Linux服务器编程

    根据提供的文件信息,本篇文章将围绕“C/C++完整视频教程(三...需要注意的是,这些知识点是相辅相成的,只有将它们融会贯通,才能更好地应对实际开发中的挑战。希望每位学习者都能从中受益,不断提升自己的技术水平。

    C/C++面试大全 华为面试

    根据给定文件中的信息,“C/C++面试大全 华为面试”这份资料主要涵盖了C/C++语言的基础知识以及华为公司对于这些知识点的具体面试题目。通过分析描述和部分内容,我们可以总结出以下几方面的知识点: ##### 1. ...

    C/C++贪吃蛇游戏

    《C/C++贪吃蛇游戏》是一款完全由开发者独立构思并实现的小游戏,它展示了C/C++编程语言在游戏开发中的应用。贪吃蛇游戏,作为一个经典的计算机游戏,其核心算法设计包括蛇的移动、碰撞检测、食物生成、分数计算等...

    IBM AIX xlc/c++ 编译器参考手册

    ### IBM AIX xlc/c++ 编译器参考手册知识点概览 #### 一、IBM XL C/C++ Enterprise Edition V8.0 for AIX编译器概述 IBM XL C/C++ Enterprise Edition V8.0 for AIX是一款专为IBM AIX操作系统设计的高性能C/C++...

    嵌入式C/C++语言精华文章集锦

    本文集锦总结了嵌入式C/C++语言开发中的一些核心知识点,包括结构体的深度探索、`extern "C"`的含义、C语言高效编程技巧、成为嵌入式程序员应知的基本问题以及嵌入式Linux移植的真实体验。这些内容不仅涵盖了理论...

    Demo: c/c++动态库(DLL)调用,c#等其他语言调用c/c++的DLL

    在编程领域,跨语言通信是常见需求,...通过理解以上知识点,开发者可以有效地利用C/C++动态库实现跨语言的代码复用,提高项目的灵活性和效率。在实际操作中,务必按照最佳实践和规范编写代码,以确保兼容性和稳定性。

    C/C++中结构体(struct)知识点强化

    ### C/C++中结构体(struct)知识点强化 #### 结构体定义与理解 在C/C++编程语言中,**结构体(struct)**是一种用户自定义的数据类型,它允许开发者将不同类型的变量组合在一起形成一个单一的实体。这为解决复杂问题...

    c/c++面试应该注意

    ### C/C++ 面试应注意的关键知识点 #### 一、转义序列与ASCII码 在C/C++中,转义序列是一种特殊的字符表示方法,例如`'\72'`中的`\72`代表了一个字符,这里的`72`是以八进制形式表示的ASCII码值,对应的ASCII字符...

    c/c++学习的软件

    通过使用这个压缩包中的资源,新手可以在实践中学习这些知识点,从而更深入地理解C/C++编程。同时,安装指南和Readme文件会提供使用软件的具体步骤和注意事项,确保用户能够顺利地开始编程之旅。

    C/C++与Python混编的详细文件

    总结,C/C++与Python混编涉及的知识点包括C++的面向对象编程、动态链接库的创建、Python的ctypes库使用、数据类型转换、异常处理、内存管理和性能优化等。通过这种方式,开发者可以充分利用C/C++的高性能特性和...

    名企经典c/c++笔试题100道

    本资源汇集了一百道来自名企的C/C++笔试题,涵盖了算法、数据结构、对象_oriented programming等方面的知识点。通过对这些题目的解析,可以帮助大家更好地理解和掌握C/C++编程语言。 1. 把二元查找树转变成排序的...

    Java programming for C/C++ developers

    - 需要特别注意的是,Java中的对象处理方式与C/C++大相径庭,Java通过垃圾回收机制自动管理内存,而C/C++则依赖于手动内存管理。 ##### 3. **Java语言特性概览:** - Java是一种强类型、面向对象的语言,与C/C++...

    c/c++面试指南

    ### C/C++面试指南知识点概览 #### 第一篇:求职 **1.1 企业与人才** - **1.1.1 企业需要什么样的人才**: - 技术能力:掌握C/C++语言的基本语法及特性。 - 项目经验:具备实际项目开发经验,了解软件开发流程...

    软件工程师C/C++笔试题

    在软件工程师的C/C++笔试中,面试...这些知识点涵盖了C/C++的基础,是软件工程师必须掌握的内容,对于解决实际问题和编写高效代码至关重要。在面试中,表现出对这些概念的理解和熟练运用,可以给面试官留下深刻的印象。

    c/c++完整视频教程(四)——–数据库(MySQL,Oracle)

    下面将详细展开这一主题的相关知识点。 ### C/C++与数据库交互的基础 #### 1. 数据库简介 - **MySQL**:MySQL是一个开源的关系型数据库管理系统,它支持SQL(Structured Query Language)语言,并因其高效、稳定和...

    C/C++处理文本中中文内容

    在C/C++编程中,处理中文内容涉及到许多关键知识点,特别是在面对半角和全角字符时。半角字符和全角字符是中文环境下常见的字符表示形式,它们在宽度和编码上有所不同,对于文本处理和输出格式有着显著影响。 首先...

    C++ 工程师校招面试考点汇总_面试_c/C++_C++校招知识点_c++面试考点_

    在C++工程师的校招面试中,面试官通常会考察一系列关键知识点,这些知识点涵盖了语言基础、编程技巧、数据结构、算法以及系统设计等多个方面。以下是对这些面试考点的详细阐述: 1. **C++语言基础**:面试者需要...

Global site tag (gtag.js) - Google Analytics