C/C++
C/C++学习
爱炒饭
每天进步一点点
展开
-
C++类的前向声明
前向声明和#include类似,但是#include会增加编译时间,而且#include文件中可能有很多用不到的功能模块。1、对于未定义的类,使用前要先前向声明,前向声明后只能使用对象指针以及对象引用,不能直接使用对象,更不能访问对象细节#include<stdio.h>//class B;//注释掉前置声明会报错class A{public : void func_A(B &b); void printA(){ printf("pri原创 2020-10-01 17:07:58 · 1114 阅读 · 0 评论 -
C++面向继承时构造函数初始化
1、参数初始化C++派生类不能继承基类的构造函数,对于派生类新增成员,派生类自定义构造函数初始化;对于继承来的成员,调用基类构造函数进行初始化。当基类没有默认构造函数时,派生类构造函数需要给基类构造函数传递参数,形如下面格式,具体可以参考virtual实现C++运行时多态一文中的实例:派生类名::派生类名(基类所需形参,本类成员所需形参):基类名(参数表),本类成员初始化列表{//其他初始化}多继承时构造函数定义如下:派生类名::派生类名(参数表):基类名1(基类1初始化参数表),原创 2020-09-26 10:49:31 · 1828 阅读 · 1 评论 -
operator重载运算符
C++已经为基本类型和标注库中的数据类型提供了运算符操作,我们自定义数据类型的话有时就需要重载运算符实现自定义函数来实现类似功能了,此时可以把operator ==、operator=、operator*等操作符整体看作一个函数名。一、单目运算符++/--(以++为例)1、重载为类的成员函数假设obj表示对象,func为成员函数,那么func的前置重载形式 func obj 相当于 obj.operator func(),无形参。前置++运算符表示先自增1然后返回对象本身,那么针对前置++就是+原创 2020-09-25 09:07:41 · 3129 阅读 · 0 评论 -
virtual实现C++运行时多态
#include<stdio.h>class Shape{public: Shape(int width,int height):mWidth(width),mHeight(height){ printf("shape constructor\n"); } long getArea(){ printf("shape getArea,width=%d,height=%d\n",mWidth,mHeight); retur.原创 2020-09-22 14:48:33 · 507 阅读 · 2 评论 -
const与指针
判断哪个被const了的标志是const在*的前面还是后面1、所指是const表示不能通过这个指针去修改那个变量(并不能使得那个变量成为const)int i=3,j=6;const int*p=&i; //non-const pointer,const data*p=26;//ERROR!(*p) 是consti=26;//OKp=&j; //OK2、指针是const表示一旦得到了某个变量的地址,不能再指向其他变量int i=3,j=6;int*原创 2020-09-04 20:16:21 · 132 阅读 · 0 评论 -
C++构造函数
1、复制构造函数如果代码中没有为某个类定义复制构造函数,那么编译器就会隐式声明一个拷贝构造函数。比如下面的constructor.cpp中的Point类,我并没有创建Point(Point& p)形式的构造函数,但是Point b(a)却可以成功。#include <stdio.h>#include <string>using std::string;class Point{public: Point(int x_value,int& y原创 2020-09-03 20:39:40 · 198 阅读 · 0 评论 -
C/C++函数传值、传指针、传引用
1、函数参数传值,函数执行结束后实参本身的值并没有变化#include <stdio.h>void swap(int a,int b){ int temp=a; a=b; b=temp;}int main(){ int a=3,b=5; printf("before swap,a=%d,b=%d\n",a,b); swap(a,b); printf("after swap,a=%d,b=%d\n",a,b); retu原创 2020-08-24 21:55:09 · 256 阅读 · 0 评论 -
C++类型转换
C++主要有const_cast、dynamic_cast、reinterpret_cast、static_cast四种类型转换。1、C++中非常量是可以转化为常量的(给变量赋值可以),但是不允许常量直接转换为非常量const_cast(给常量重新赋值不可以),如果需要给常量重新赋值,那么可以使用const_cast2、子类转换为父类并使用父类中的方法,这毫无争议。但是反之,父类转换为子类并且调用子类的方法是不允许的,如果需要子类的方法可以使用dynamic_cast3、reinterpret_原创 2020-08-01 13:57:38 · 1476 阅读 · 0 评论 -
C++分段拷贝字节
memcpy可以用来拷贝原资源到目标资源的指定长度的数据,但是不能只拷贝中间的一段数据。如果拷贝中间一段的数据,此时可能就需要逐字节拷贝void get_bytes(uint8_t* dst_bytes,uint8_t* source_bytes){ for (int i = 0; i < 4; i++) { for (int j = 0; j < 2; ++j) { *dst_bytes++ = *source_bytes+i*5+j+原创 2020-07-25 17:34:28 · 1142 阅读 · 0 评论 -
ndk传递二维byte数组
本次以一个简单二维char数组(行数为3)为例演示。native方法声明代码 public native void byteFromJNI(byte[][] buffer);java端调用native代码 byte[][] data=new byte[3][]; data[0]="hello".getBytes(); data...原创 2020-01-28 18:25:29 · 702 阅读 · 0 评论 -
ndk获取指定目录下的所有文件名
#include <jni.h>#include <string>#include <android/log.h>#define LOG_TAG "MyCTestLog"#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)#include <iostream>#include <unistd.h>#include <dire.原创 2020-07-20 10:51:36 · 485 阅读 · 0 评论 -
C++多线程中的互斥量和互斥锁
C++多线程竞争时经常用到互斥量用std::mutex,它可以单独使用,也可以和互斥锁在一起使用。std::mutex单独使用的话就lock()加锁,用unlock()解锁。为了方便的话可以用用互斥锁lock_guard,lock_guard会在创建时自动加锁,并且在作用域结束时自动析构释放锁。lock_guard只能在创建时加锁,在作用域结束时释放锁,如果想中间释放锁呢,此时就需要加强版的unique_lock了,unique_lock可以随时加锁和解锁,并且可以和条件变量 std::cond原创 2020-07-17 20:54:19 · 539 阅读 · 0 评论 -
C++中char数组指针所指内容的内存地址
char *p = "This is a string!";LOGD("p content address:%s",p);LOGD("p point address:%p",&p);LOGD("p1 address:%p",reinterpret_cast<long>(p));LOGD("p2 address:%p",(long)p);打印如下:2020-0...原创 2020-03-20 20:13:32 · 983 阅读 · 0 评论 -
C++结构体和类的成员函数
1、使用结构体成员变量"."还是“->"的区别?一般的结构体成员变量访问用"."即可,只用结构体指针访问结构体成员才使用“->"#include <iostream>#include<cstring>using namespace std;struct Books{ char title[50]; char author[50]; int...原创 2019-08-02 16:32:45 · 5288 阅读 · 0 评论