C++文件头,命名空间,new和delete,内联函数,引用,函数重载,构造函数和析构函数,深拷贝和浅拷贝,explict,this指针
目 录
1 开始学习C++..............................................................................................................4
1.1 C++的头文件.......................................................................................................4
1.2 命名空间...............................................................................................................4
1.3 更严格的类型转化................................................................................................4
1.4 new和delete.......................................................................................................4
1.5 内联函数...............................................................................................................4
1.6 引用......................................................................................................................5
1.7 函数的重载...........................................................................................................5
2 类和对象......................................................................................................................6
2.1 C++类成员的保护..............................................................................................6
2.2 C++类的本质.......................................................................................................6
2.3 类的作用域...........................................................................................................6
2.4 类的构造和析构函数............................................................................................6
2.5 构造函数的初始化成员列表.................................................................................6
2.5.1 原则:...........................................................................................................7
2.6 拷贝构造函数.......................................................................................................7
2.6.1 浅拷贝...........................................................................................................7
2.6.2 深拷贝...........................................................................................................7
2.6.3 原则:...........................................................................................................8
2.7 常量类成员,常量对象。.....................................................................................8
2.8 explicit.................................................................................................................8
2.9 this指针...............................................................................................................8
2.10 类的static成员变量............................................................................................8
1 开始学习C++
1.1 C++的头文件
传统的C头文件。(支持.h头文件,比如:#include<stdio.h>)
C++头文件。(不加.h的头文件,比如:#include<iostream>)
1.2 操作符重载
cout << "Hello World!"<< endl;
1.3 关于使用命名空间的情况
B:如果不使用用usingnamespace std;那么这个时候可以在代码中使用类似下面的情况:
std:cout << "Helloworld\n" << endl;
1.4 命名空间
C++引入了新的概念,命名空间可以有效避免大型项目中的各种名称冲突
class是C++的核心,是面向对象编程的核心内容。一个class案例:
private://私有的,只要下面不访问这里的age,程序就不会出现问题
cout << m.name << m.sex << endl;
1.5 volatile关键字
volatile int i=0;//保证i不被编译器优化,以便能进行中间步骤
1.6 更严格的类型转化
在C++,不同类型的指针是不能直接赋值的,必须强转。(也就是如果两个指针类型不同,不能直接把一个赋值给另外一个,而是要通过强转的方式实现)
1.7 new和delete
c++中不建议使用malloc和free开辟内存或释放内存。而是使用new和delete。
new和delete是C++内建的操作符,不需要有任何头文件,用new分配的内存必须用delete释放,不要用free。
int *p=new int; 等价于:int*p=new int(10);//分配内存的同时初始化
int *p=new int[10]; //表示开辟10个空间的数组
delete []p; //如果要删除这些数组的空间,要加上[],表示这时候删除的是一个数组。
1.8 内联函数
inline关键字的意思是,内联函数不作为函数调用,而是直接把内联函数的代码嵌
1.9 引用
C++允许函数在定义的时候,提供缺省参数,如果调用函数的时候没有提供形参,那么形参的值就是缺省值,也就是说用默认值。
此外,函数会自动通过传递的参数类匹配调用哪个函数,案例如下:
如果要使引用参数的值不能在函数内部被修改,那么就定义为常量引用 const &
1.10 函数的重载
1.11 模板
int max(int x,int y);
{return(x>y)?x:y ;}
//函数2.
float max( float x,float y){
return (x>y)? x:y ;}
//函数3.
double max(double x,double y)
{return (c>y)? x:y ;}
但如果在主函数中,我们分别定义了 chara,b;那么在执行max(a,b);时程序就会出错,因为我们没有定义char类型的重载版本。
Template <class或者也可以用typename T>
说明: template是一个声明模板的关键字,表示声明一个模板关键字class不能省略,如果类型形参多余一个,每个形参前都要加class <类型形参表>可以包含基本数据类型可以包含类类型.
//声明一个函数模版,用来比较输入的两个相同数据类型的参数的大小,class也可以被typename代替,
cout<<"较小整数:"<<min(n1,n2)<<endl;
cout<<"较小实数:"<<min(d1,d2)<<endl;
Template < class或者也可以用typename T >
class类名{
//类定义......
};
说明:其中,template是声明各模板的关键字,表示声明一个模板,模板参数可以是一个,也可以是多个。
// ClassTemplate.h
#ifndef ClassTemplate_HH
template<typename T1,typename T2>
myClass(T1 a, T2 b);//Constructor
template <typename T1,typename T2>
myClass<T1,T2>::myClass(T1 a,T2 b):I(a),J(b){}
template <typename T1,typename T2>
cout<<"I="<<I<<",J="<<J<<endl;
myClass<int,char>class2(3,'a');
myClass<double,int>class3(2.9,10);
2 类和对象
2.1 C++类成员的保护
如果类函数返回的是成员变量的指针,为了避免在类外部成员变量被修改,所以函数就要返回常量指针
如果一个类成员变量和一个全局变量重名,那么在类成员函数当中默认访问的是类的成员变量.
在类的内部访问全局标识,使用关键字::,表示释放全局变量或者全局函数
2.2 C++类的本质
类其实就是结构的数据成员加可执行代码,统一提供封装,继承,多态。
// intget_age()//很有可能被编译器编译为inline了
voidman::set_name(constchar*s)
//类的大小实际上是成员变量的大小,和去掉方法后的结构体的大小时相同的
printf("sizeof(man)=%d\n",sizeof(man));
2.3 类的作用域
2.4 类的构造和析构函数
构造函数名称和类的名称一致,而且没有返回值,在一个类实例化为一个对象的时候,自动调用。
如果没有写构造函数,会生成一个默认的构造函数和析构函数,这时候编译器会自动生成。
如果想传递给函数一个类的变量,为了内存消耗减小,传递的是一个类的指针。或引用
2.5 构造函数的初始化成员列表
constintage; //如果是一个常量,必须是通过初始化常量列表的方式赋值,也就是说通过:方式赋值
// intget_age()//很有可能被编译器编译为inline了
man::man():age(24) //通过后面加上:的方式初始化成员变量的值
//之所以在后面初始化值,是因为类的成员变量加了const了。
man::man(constchar*s,inti):age(15)
cout<< "man(constchar *s,int i)diao yongle" <<endl;
//由于构造函数里只有一个,所以在不同的构造函数里面给函数成员指针分配内存的时候,一定
voidman::set_name(constchar*s)
manm; //在栈当中将man这个类实例化为一个对象叫man
//cout<<"----重载构造函数后的参数(1个参数)----"<<endl;
cout<< "--oneargumemts--" << endl;
//cout<<"----重载构造函数后的参数(2个参数)----"<<endl;
cout<< "----twoarguments----"<< endl;
deletep2; //不能通过free(*p2)的方式使用
2.5.1 原则:
由于析构函数只有一个,所以在不同的构造函数里面给函数的成员指针分配内存的时候,一定要统一new或者new[]
2.6 拷贝构造函数
2.6.1 浅拷贝
2.6.2 深拷贝
不同的对象指针成员指向不同的内存地址,拷贝构造的时候不是简单的指针赋值,而是将内存拷贝过来(先申请内存空间)。
2.6.3 原则:
如果类成员有指针,那么需要自己实现拷贝构造函数,不然存在浅拷贝的风险。
2.7 常量类成员,常量对象
类成员后面跟关键字const意思是告诉编译器,这个函数内部不会对类成员变量做任何修改。
函数的参数如果是一个类,那么就用类的引用。如果不想参数被调用函数内部修改,那么就采用const&
2.8 对象数组
demod[3]={demo(1),demo(2),demo(3)};
2.9 explicit
告诉C++编译器,要明确的调用这个构造函数,而不要自作聪明的认为=操作符是要调用构造的。
staticintcount;//定义一个类的静态成员变量,不可以进行初始化
explicitman(intage);//加了explicit之后表示就用这个构造函数。
intman::count=0;//类静态成员变量初始化的方式
voidman::set_name(constchar*s)
constchar*man::get_name()const
//age=10;//类的静态函数内部不能直接访问类的动态成员变量。
manm2=m1;//在栈当中将man这个类实例化为一个对象叫m
cout<< "m2.name:"<< m2.get_name()<< endl;
cout<< "m2.name:"<< m2.get_name()<< endl;
//cout<<"m1"<<m1.get_name()<<endl;
// man*p=newman("hello",100);//调用没有参数的构造函数,在堆实例化一个对象
2.10 this指针
staticmystring*makestring(constchar*s= NULL);
mystring*mystring::makestring(constchar*s)
self=NULL;//释放指针之后,赋值NULL,这样就可以再次建立类的实例
mystring::mystring(constchar*s)
mystring::mystring(constmystring&it)//通过拷贝构造实现深拷贝,避免成员变量指针赋值导致的错误
constchar*mystring::get_s()const
voidmystring::set_s(constchar*s)
delete[]this->s;//由于成员变量s的空间不够了,所以不要了
this->s=newchar[len2+1];//重新给成员变量s分配新空间
this->s[len2]=0;//新空间最后一个字节为字符串结束标示符0
// mystringstr1("helloworld");
//mystring*str1=mystring::makestring();//默认调用的是NULL
mystring*str1=mystring::makestring("helloworld");//默认调用的是NULL
mystring*str3=mystring::makestring("aaaaaaa");
2.11 类的static成员变量
static变量是放到静态内存区的,程序加载就存在,一直到程序退出才清理。
类的static成员和类的对象没有直接关系,类的静态成员是放到静态内存区的,程序开始执行就存在,一直到程序结束才清理。
single*p=single::makesignle();
single*p1=single::makesignle();
C++文件头,命名空间,new和delete,内联函数,引用,函数重载,构造函数和析构函数,深拷贝和浅拷贝,explict,this指针相关推荐
- C++ 类与对象及重载、内联、引用等知识点【练习题】(含OJ题、选择题等),也包括一些需要注意的知识点
目录 一.OJ题 1.日期差值_牛客题霸_牛客网 2.计算日期到天数转换_牛客题霸_牛客网 3.求1+2+3+...+n_牛客题霸_牛客网 4.打印日期_牛客题霸_牛客网 5.日期累加_牛客题霸_牛客 ...
- 【Kotlin】apply 内联扩展函数 ( apply 函数原型 | apply 函数示例 | Kotlin 调用 Java API )
文章目录 I . 内联扩展函数 apply II . Kotlin 调用 Java API III . apply 内联扩展函数示例 ( 调用 Java API 处理图像 ) I . 内联扩展函数 a ...
- 一文读懂C#中的抽象类、抽象方法、virtual虚函数、override重写函数及父类子类构造函数和析构函数的执行顺序
// 父类 class People {public People(){Console.WriteLine("执行People构造函数!");}public virtual voi ...
- STM32 进阶教程 5 - 内联函数
前言 在计算机科学中,内联函数(有时称作在线函数或编译时期展开函数)是一种编程语言结构,用来建议编译器对一些特殊函数进行内联扩展(有时称作在线扩展):也就是说建议编译器将指定的函数体插入并取代每一处调 ...
- 32位汇编第七讲,混合编程,内联汇编
32位汇编第七讲,混合编程 博客园IBinary原创 QQ:2510908331 博客连接:http://www.cnblogs.com/iBinary/ 转载请注明出处,谢谢 混合编程的概念,有时 ...
- 【转贴】GCC内联汇编基础
原文作者 Sandeep.S 英文原文 [https://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html] 本文将介绍GCC编译环境下 ...
- react-native入门之RAM Bundles 和内联引用优化
文档:RAM Bundles 和内联引用优化 · React Native 中文网 1.简介 对较为庞大的应用程序,考虑使用 Random Access Modules 格式的 bundle 和内联引 ...
- html 中内联样式表,html – CSS带有内联样式的伪类
不,这是不可能的.在使用CSS的文档中,内联样式属性只能包含属性声明;在样式表中的每个规则集中出现的同一组语句.从 Style Attributes spec: The value of the st ...
- css实例 css中id/class 详解样式表(外部样式表 内部样式表 内联样式 7种基础选择器 多重样式优先级 错误理解)[第一天]
文章目录 css实例 css中的id css中的class 样式表 外部样式表 内部样式表 内联样式 7种基础选择器 多重样式优先级 错误理解 css实例 CSS 规则由两个主要的部分构成:选择器,以 ...
最新文章
- 自定义windows开机声音
- 线程对象Android 开发之多线程处理、Handler 详解
- Python全栈工程师(异常(基础))
- android 安卓市场,安卓市场(Android Market).doc
- 【转】cs231n学习笔记-CNN-目标检测、定位、分割
- 现在在做的项目的一些感想.
- [CLR团队公告]CLR基础研究团队纲领
- php自动加载 依赖,php自动加载
- 可以学计算机再学美术,想学习板绘?教你如何在电脑学习绘画!
- 【吐血整理】超全golang面试题合集+golang学习指南+golang知识图谱+成长路线 一份涵盖大部分golang程序员所需要掌握的核心知识。
- 用天平找次品的算法题,即三等分算法
- Arduino作为编程器读写BIOS、bootloader、uboot或者breed
- 苹果无需越狱(iPhone、iPad)手机多开教程
- 计算机基础及msoffice应用内容,计算机一级计算机基础及 ms office 应用考些什么 自考计算机应用基础,要考哪些内容?...
- 关于 Sem Ver(semantic versioning)
- 关于 PoW 和 PoS
- 经典逻辑题:猜牌问题——网上的结论是没问题的
- SAP mbew 标准价和移动平均价
- 计算机表格标题怎么做,做表必备!超实用的五个制作Excel表头的技巧,快速学起来...
- 【LeetCode - Java】14. 最长公共前缀 (简单)
热门文章
- 电气备自投笔记书籍介绍(持续更新中)
- JavaScript实现ShellSort希尔排序算法(附完整源码)
- OpenCASCADE:Genproj tool构建OCCT
- boost::mpl模块实现zip_view相关的测试程序
- boost::math::daubechies_scaling用法的测试程序
- boost::hana::take_front用法的测试程序
- 宏BOOST_CHECK_EXCEPTION用法的测试程序
- 测试core :: demangled_name
- Boost:can_require的使用测试程序
- ITK:重新缩放图像